2012-11-22 4 views
5

Ich möchte eine Ajax-basierte Komponente (KendoUI) verwenden, um Entitäten auf einem von WCF DataServices implementierten OData-Endpunkt zu lesen/ändern.WCF DataService unterstützt keine Preflight-OPTIONS-Anfragen?

Die Service-Implementierung war ziemlich einfach, in erster Linie:

public class MyFooService : DataService<FooContext> 
{ 
    public static void SetEntitySetAccessRules(IDataServiceConfiguration config) 
    { 
     config.SetEntitySetAccessRule("Foos", EntitySetRights.AllWrite); 
    } 
} 

Jetzt mit PUT Ich habe erwartet, die Lage sein, Einheiten zu ändern. KendoUI bietet eine nette und einfache Konfigurationsoberfläche und leistet gute Arbeit bei der Erzeugung der PUT-Anfrage.

Wir machen eine domänenübergreifende Anfrage und verwenden CORS. So sendet beispielsweise Firefox eine Preflight-OPTIONS-Anfrage an den OData-Service, bevor er die PUT sendet.

Leider scheint der Service-Endpunkt OPTIONS out-of-the-box nicht zu unterstützen: Die Antwort auf die OPTIONS-Anfrage ist "501 Not Implemented" mit einem leeren Inhalt. Wenigstens konnten wir, dass die Antwort die CORS-Header hat wie folgt:

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    <!-- Enable cross-origin resource sharing --> 
    <!-- http://enable-cors.org/#how-asp.net --> 
    <httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Methods" value="POST, PUT, DELETE, GET, OPTIONS" /> 
     <add name="Access-Control-Allow-Headers" value="content-Type, accept, origin, X-Requested-With" /> 
     <add name="Access-Control-Allow-Credentials" value="true" /> 
    </customHeaders> 
    </httpProtocol> 
</system.webServer> 

für diese Googeln hat ein bisschen schwierig, weil „Optionen“ stellte sich heraus, ist ein sehr beliebter Begriff ...

Ich fand this article aber es scheint sehr, sehr kompliziert. Ich meine, OData dreht sich alles um REST, ich kann mir nicht vorstellen, dass WCF Data Services keine einfache Möglichkeit bieten, Preflight-Anfragen zuzulassen, oder?

+1

Ich nehme an, dass WCF OData Dienst funktioniert auf WCF und durchläuft dieselbe WCF-Pipeline. Wenn ja, schau dir den Link in dieser [Antwort] an (http://stackoverflow.com/questions/11597314/origin-http-localhost-is-not-allowed-by-access-control-allow-origin/11606701#11606701). IMHO ist der einfachste Weg, um CORS in WCF zu implementieren. – Obaid

+0

Ich weiß, dass dies nicht genau das ist, was Sie wollen, aber ich denke, der einfachste Weg, um mit domänenübergreifenden Anfragen zu arbeiten, ist, nur den Reverse-Proxy des IIS zu verwenden. Auf diese Weise gehen Sie nur gegen Ihre eigene Domain und der IIS ist wer Ihre Anfrage an die andere Domain sendet. Dann muss Ihr Code nichts über andere Domains wissen. – lontivero

+0

Zufällig darüber gestolpert; dachte nur, ich würde zu [this] (https://stackoverflow.com/questions/19808069/wcf-dataservice-odata-and-cors) und [das] verlinken (https://data.uservoice.com/forums/ 72027-WCF-Daten-Services-Feature-Vorschläge/Vorschläge/4450449-Cors-Unterstützung) für zusätzliche Diskussion. – tne

Antwort

1

Gegenwärtig unterstützt WCF DataServices keine CORS, und jede Lösung, die ich gesehen habe, ist ein Hack und funktioniert bestenfalls flockig.

Ich hatte das gleiche Problem, und ich portierte nur meinen Code von WCF zu einer Web-API 2 OData-Lösung. Web API 2 unterstützt CORS und ist sehr einfach einzurichten.

Wenn Sie mit Web-API vertraut sind, lesen Sie in diesem Link: http://msdn.microsoft.com/en-us/magazine/dn532203.aspx

Und hier ist eine Anleitung, wie man ein OData-Endpunkt mit Web-API erstellen: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v3/creating-an-odata-endpoint

+0

Danke. Obwohl die Antwort zu spät ist (ich habe das Problem gelöst, indem ich auch zu WebAPI gewechselt habe :-)) - dies wird für alle zukünftigen Leser eine hilfreiche Antwort sein, soweit ich das beurteilen kann. – chiccodoro