Ich verwende derzeit WCF Data Services (auch ADO.Net Data Services) mit Entity Framework und erhalte den folgenden Fehler, wenn ein POST ausgeführt wird (einige irrelevante Informationen wurden weggelassen / geändert):
<?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>
Ich schaue mich online um und finde anscheinend nicht viele Informationen zu dieser Nachricht. Das Debuggen ist also etwas schwierig. Dies ist wahrscheinlich der Fall, weil eines der Attribute, die ich ausschreibe, eine große base64-Zeichenfolge ist (es funktioniert gut, wenn ich dies nicht poste). Ich habe versucht, die maxRequestLength
auf Folgendes maxRequestLength
:
<httpRuntime maxRequestLength="102400" />
Aber es scheint nicht geholfen zu haben. Während ich weiter damit arbeite, dachte ich, ich würde hier kurz einen Beitrag posten, um zu sehen, ob jemand etwas weiß, das helfen könnte.
Meine WCF Data Service-Klasse sieht folgendermaßen aus:
public class MyWcfDataServices: DataService<ContextName>
{
public static void InitializeService(DataServiceConfiguration config)
{
// set entity access rules etc
}
}
Vielen Dank
EDIT : Ich scheine damit nichts zu erreichen. Hier ist was ich bisher ausprobiert habe.
Auf der Serverseite habe ich folgende Bindungen gesetzt:
<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>
In der Hoffnung, dass das Attribut maxItemsInObjectGraph
die Lösung wäre. Sehen diese Bindungen richtig aus? Fehlt mir ein Attribut, mit dem ich mehr Daten auf den Server stellen kann? Muss ich dieses Serviceverhalten auch auf dem Client konfigurieren?
OK, ich habe das Problem behoben. Zuerst habe ich die Ablaufverfolgung auf dem Server aktiviert, indem ich meiner web.config Folgendes hinzugefügt habe:
<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>
Dies gab mir viel mehr Informationen zu den Problemen, insbesondere in meinem Fall betrug die maximale Anforderungslänge noch 65536 , was darauf hinweist, dass meine Bindungen nicht abgeholt wurden. Dies hatte zwei Gründe: Erstens war der name
meiner service
Konfiguration nicht korrekt - er musste die Namespace-Informationen enthalten. Ich endete damit (ich musste dies auch in die web.config des Clients einfügen):
<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>
Schließlich musste ich in der Markup-Datei meiner .svc-Datei von der Vorlage generierte System.Data.Services
Assembly in die ODATA-Assembly von Microsoft ändern (die auch System.Data.Services-Namespaces enthält) System.Data.Services.DataServiceHostFactory, Microsoft.Data.Services, Version=5.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
.
Ich habe jetzt weniger Haare als zu Beginn, aber das ist der Preis, den Sie zahlen.
Ich habe dieses Problem erhalten, da einige DataMembers in meinem DataContract nur eine Methode hatten. Zum Beispiel
[DataMember]
public Name { get; }
wird diesen Fehler verursachen. Um das Problem zu beheben, das Sie haben sollten
[DataMember]
public Name {get; set;}