Attualmente sto utilizzando WCF Data Services (beh, ADO.Net Data Services) con Entity Framework e sto riscontrando il seguente errore durante l'esecuzione di un POST (omesso / modificato alcune informazioni irrilevanti):
<?xml version="1.0" encoding="utf-8"?><m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><m:code /><m:message xml:lang="en-GB">The URI 'http://localhost:56568/MyWcfDataServices.svc/EntitySetName(pk_id)' is not valid for POST operation. For POST operations, the URI must refer to a service operation or an entity set.</m:message></m:error>
Dando un'occhiata in giro, non riesco a trovare molte informazioni su questo messaggio, quindi il debugging è un po 'difficile. È probabile che accada perché uno degli attributi che sto postando è una grande stringa base64 (funziona bene se non la pubblico). Ho provato a impostare maxRequestLength
su quanto segue:
<httpRuntime maxRequestLength="102400" />
Ma non sembra aver aiutato. Mentre continuerò a lavorare su questo, ho pensato di fare un post rapido qui per vedere se qualcuno sa qualcosa che possa aiutare.
La mia classe di servizio dati WCF si presenta così:
public class MyWcfDataServices: DataService<ContextName>
{
public static void InitializeService(DataServiceConfiguration config)
{
// set entity access rules etc
}
}
Grazie
EDIT : Non mi sembra di essere da nessuna parte con questo. Ecco cosa ho provato finora.
Sul lato server ho impostato i seguenti binding:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
minFreeMemoryPercentageToActivateService="0" />
<services>
<service name="MyWcfDataServices"
behaviorConfiguration="myBehaviorConfig">
<endpoint address=""
binding="webHttpBinding"
bindingConfiguration=""
contract="System.Data.Services.IRequestHandler" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="myBehaviorConfig">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Sperando che l'attributo maxItemsInObjectGraph
sia la soluzione. Questi attacchi sembrano corretti? Mi mancano alcuni attributi che mi permetteranno di inviare più dati al server? Devo configurare questo comportamento del servizio anche sul client?
OK, ecco cosa ho fatto per risolvere il problema. Innanzitutto ho abilitato la traccia sul server aggiungendo quanto segue al mio web.config:
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="c:\logs\Traces.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
Questo mi ha dato molte più informazioni sui problemi, in particolare nel mio caso la lunghezza massima della richiesta era ancora 65536 , che indicava che i miei attacchi non venivano raccolti. Si trattava di due cose, in primo luogo la parte del name
della mia configurazione del service
non era corretta: era necessario includere le informazioni sullo spazio dei nomi. Ho finito con questo (ho dovuto mettere questo anche nel web.config del client):
<services>
<service name="Solution.Project.MyWcfDataServices">
<endpoint address=""
binding="webHttpBinding"
bindingConfiguration="webHttpConfig"
contract="System.Data.Services.IRequestHandler" />
</service>
</services>
<bindings>
<webHttpBinding>
<binding name="webHttpConfig"
allowCookies="true"
maxReceivedMessageSize="20000000"
maxBufferSize="20000000"
maxBufferPoolSize="20000000">
<readerQuotas maxDepth="32"
maxArrayLength="200000000"
maxStringContentLength="200000000" />
</binding>
</webHttpBinding>
</bindings>
Infine, ho dovuto modificare factory nel markup del mio file .svc dal modello generato dall'assembly System.Data.Services
all'assembly ODATA di Microsoft (che contiene anche spazi dei nomi System.Data.Services.DataServiceHostFactory, Microsoft.Data.Services, Version=5.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
) System.Data.Services.DataServiceHostFactory, Microsoft.Data.Services, Version=5.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
.
Ho meno capelli ora di quando ho iniziato, ma questo è il prezzo che si paga suppongo.
Stavo ricevendo questo problema perché alcuni dei DataMembers nel mio DataContract avevano solo il metodo get. Per esempio
[DataMember]
public Name { get; }
causerà questo errore Per risolvere il problema che dovresti avere
[DataMember]
public Name {get; set;}