2012-11-22 15 views
5

Desidero utilizzare un componente basato su Ajax (KendoUI) per leggere/modificare entità su un endpoint OData implementato da WCF DataServices.WCF DataService che non supporta le richieste OPZIONI di preflight?

L'implementazione del servizio è stato abbastanza facile, in primo luogo:

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

Ora mi aspettavo di essere in grado di modificare le entità che utilizzano PUT. KendoUI fornisce un'interfaccia di configurazione semplice e facile e fa un buon lavoro nel generare la richiesta PUT.

Stiamo effettuando una richiesta tra domini e utilizzando CORS. Quindi, ad esempio, Firefox invia una richiesta OPZIONI di preflight al servizio OData prima di inviare il PUT.

Sfortunatamente l'endpoint del servizio non sembra supportare OPTIONS out-of-the-box: la risposta alla richiesta OPTIONS è "501 Not Implemented" con un contenuto vuoto. Almeno siamo riusciti che la risposta ha le intestazioni CORS come segue:

<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 per questo si è rivelata un po 'difficile perché "opzioni" è un termine molto popolare ...

ho trovato this article ma sembra molto, molto complicato. Voglio dire, OData è tutto su REST, non riesco a immaginare che i servizi dati WCF non forniscono un modo semplice per consentire le richieste di verifica preliminare, o?

+1

Suppongo che WCF OData Il servizio funziona su WCF e passa attraverso la stessa pipeline WCF. In tal caso, controlla il link in questa [risposta.] (Http://stackoverflow.com/questions/11597314/origin-http-localhost-is-not-allowed-by-access-control-allow-origin/11606701#11606701). IMHO è il modo più semplice per implementare CORS in WCF. – Obaid

+0

So che questo non è esattamente quello che vuoi, ma penso che il modo più semplice per lavorare con le richieste cross-domain sia solo l'uso del reverse proxy di IIS. In questo modo vai solo contro il tuo dominio e IIS è chi invia la tua richiesta all'altro dominio. Quindi, il tuo codice non deve sapere nulla su altri domini. – lontivero

+0

casualmente incappato in questo; ho pensato di collegarmi a [questo] (https://stackoverflow.com/questions/19808069/wcf-dataservice-odata-and-cors) e [che] (https://data.uservoice.com/forums/ 72027-wcf-data-services-feature-suggerimenti/suggerimenti/4450449-cors-support) per ulteriori discussioni. – tne

risposta

1

Attualmente WCF DataServices non supporta CORS, e ogni soluzione che ho visto è un hack e funziona come minimo.

Ho avuto lo stesso problema e ho appena trasferito il mio codice da WCF a una soluzione OData Web API 2. Web API 2 ha il supporto per CORS ed è davvero facile da configurare.

Se si ha familiarità con Web API, controlla questo link: http://msdn.microsoft.com/en-us/magazine/dn532203.aspx

Ed ecco un tutorial su come creare un endpoint OData con API Web: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v3/creating-an-odata-endpoint

+0

Grazie. Anche se la risposta è in ritardo (ho risolto il problema passando a WebAPI, anche :-)) - questa sarà una risposta utile per qualsiasi futuro lettore per quanto posso dire. – chiccodoro

Problemi correlati