2012-11-22 41 views
5

Chcę użyć składnika opartego na ajax (KendoUI) do odczytu/modyfikacji elementów na punkcie końcowym OData zaimplementowanym przez WCF DataServices.WCF DataService nie obsługuje potwierdzenia wstępnego Żądania OPTIONS?

Realizacja obsługa była dość łatwa w pierwszej kolejności:

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

Teraz Spodziewałem się, aby móc modyfikować jednostki używając PUT. KendoUI zapewnia ładny i łatwy interfejs konfiguracyjny i wykonuje dobrą robotę w generowaniu żądania PUT.

Wysyłamy żądanie między domenami i używamy CORS. Na przykład Firefox wysyła preflightowe żądanie OPTIONS do usługi OData przed wysłaniem PUT.

Niestety, punkt końcowy usługi wydaje się nie obsługiwać OPCJONALNYCH po uruchomieniu: Odpowiedź na żądanie OPTIONS to "501 Not Implemented" z pustą treścią. Przynajmniej udało się nam, że odpowiedź ma nagłówki Cors następująco:

<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> 

Googling za to okazała się nieco trudna, ponieważ „Opcje” jest bardzo popularny termin ...

ale znalazłem this article wydaje się bardzo, bardzo skomplikowany. Chodzi mi o to, że OData dotyczy wyłącznie usługi REST, nie mogę sobie wyobrazić, że usługi danych WCF nie zapewniają prostego sposobu zezwalania na żądania wstępne, lub?

+1

Rozumiem, że WCF OData Usługa działa na WCF i przechodzi przez ten sam potok WCF. Jeśli tak, sprawdź link w tej [odpowiedzi.] (Http://stackoverflow.com/questions/11597314/origin-http-localhost-is-not-ileded-by-access-control-allow-origin/11606701#11606701). IMHO jest najprostszym sposobem na wdrożenie CORS w WCF. – Obaid

+0

Wiem, że nie jest to dokładnie to, co chcesz, ale myślę, że najprostszym sposobem na pracę z żądaniami między domenami jest użycie odwrotnego proxy IIS. W ten sposób idziesz tylko przeciwko własnej domenie, a IIS jest tym, kto wysyła Twoją prośbę do drugiej domeny. Wtedy Twój kod nie musi nic wiedzieć o innych domenach. – lontivero

+0

Losowo potknął się o tym; tylko pomyślałem, że będę link do tego (https://stackoverflow.com/questions/19808069/wcf-dataservice-odata-and-cors) i [that] (https://data.uservoice.com/forums/ 72027-wcf-data-services-feature-sugestie/sugestie/4450449-cors-support) dla dodatkowej dyskusji. – tne

Odpowiedz

1

Obecnie usługi DataFit WCF nie obsługują CORS, a każde rozwiązanie, które widziałem, to włamanie i działa najlepiej w najlepszym wypadku.

Miałem ten sam problem, a ja po prostu przeportowałem mój kod z WCF do rozwiązania OData Web API 2. Web API 2 obsługuje CORS i jest bardzo łatwy w konfiguracji.

Jeśli jesteś zaznajomiony z Web API, sprawdź ten link: http://msdn.microsoft.com/en-us/magazine/dn532203.aspx

I tu jest tutorial na temat tworzenia punktu końcowego OData z Web API: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v3/creating-an-odata-endpoint

+0

Dziękuję. Choć odpowiedź jest spóźniona (rozwiązałem problem, przełączając się również na WebAPI :-)) - będzie to przydatna odpowiedź dla przyszłych czytelników, o ile mogę to stwierdzić. – chiccodoro