J'utilise actuellement WCF Data Services (ainsi, ADO.Net Data Services) avec Entity Framework et j'obtiens le message d'erreur suivant lors de l'exécution d'un POST (omis / modifié des informations non pertinentes):
<?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>
En regardant en ligne, je n'arrive pas à trouver beaucoup d’informations sur ce message, il est donc un peu difficile de le déboguer. Cela se produit probablement parce que l'un des attributs que je poste est une grande chaîne base64 (cela fonctionne bien si je ne poste pas cela). J'ai essayé de définir maxRequestLength
comme suit:
<httpRuntime maxRequestLength="102400" />
Mais cela ne semble pas avoir aidé. Pendant que je vais continuer à travailler là-dessus, j'ai pensé faire un post rapide pour voir si quelqu'un sait quelque chose qui peut aider.
Ma classe de service de données WCF ressemble à ceci:
public class MyWcfDataServices: DataService<ContextName>
{
public static void InitializeService(DataServiceConfiguration config)
{
// set entity access rules etc
}
}
Merci
EDIT : Je ne semble pas aller nulle part avec cela. Voici ce que j'ai essayé jusqu'à présent.
Sur le serveur, j'ai défini les liaisons suivantes:
<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>
En espérant que l'attribut maxItemsInObjectGraph
serait la solution. Est-ce que ces fixations semblent correctes? Me manque-t-il un attribut qui me permettra de publier plus de données sur le serveur? Dois-je également configurer ce comportement de service sur le client?
OK, voici ce que j'ai fait pour résoudre le problème. J'ai d'abord activé le traçage sur le serveur en ajoutant les éléments suivants à mon fichier 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>
Cela m'a donné beaucoup plus d'informations sur les problèmes, en particulier dans mon cas, la longueur maximale de la demande était toujours de 65 536 , ce qui indiquait que mes reliures n'étaient pas récupérées. Il s’agissait de deux choses. Tout d’abord, la partie relative au name
de la configuration de mon service
n’était pas correcte: elle devait inclure les informations sur l’espace de noms. Je me suis retrouvé avec ceci (je devais mettre ça aussi dans le web.config du 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>
Enfin, j'ai dû changer de fabrique dans le balisage de mon fichier .svc à partir du modèle généré System.Data.Services
avec l'assemblage ODATA de Microsoft (qui contient également les espaces de noms 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
.
J'ai moins de cheveux que quand j'ai commencé, mais je suppose que c'est le prix à payer.
Je devenais ce problème parce que certains des DataMembers dans mon DataContract avaient seulement la méthode get. Par exemple
[DataMember]
public Name { get; }
provoquera cette erreur. Pour résoudre le problème, vous devriez avoir
[DataMember]
public Name {get; set;}