2016-02-25 21 views
11

Sto tentando di aggiungere alcune funzioni endpoint annotate [WebMethod] a un'app Web in stile Webform (.aspx e .asmx).Endpoint CORS su endpoint Webforms asp.net [WebMethod]

Mi piacerebbe annotare questi endpoint con [EnableCors] e quindi ottenere tutte le buone funzionalità di ajax-preflight.

VS2013 accetta l'annotazione, ma gli endpoint non funzionano correttamente con CORS. (Funzionano bene se usate la stessa origine ma non l'origine incrociata).

non riesco nemmeno a farli funzionare cross-origine, con il basso e sporco

HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "*"); 

approccio - miei browser rifiutano le risposte, e non appaiono le intestazioni di risposta cross-origine.

Come posso ottenere la funzionalità CORS in questi endpoint [WebMethod]?

+0

WebForms ha reso difficile la modifica delle intestazioni, ad es. non appena viene inviato qualcosa all'utente, non è possibile modificare le intestazioni. Ecco un trucco che ho usato prima: http://stackoverflow.com/questions/4091157/httpmodule-to-add-headers-to-request – MatthewMartin

+0

E un altro modo per farlo con webconfig http://stackoverflow.com/questions/2922178/is-it-possible-to-add-response-http-headers-in-web-config – MatthewMartin

+0

E un modo più moderno di manipolare le intestazioni usando il middleware owin: http://www.mikesdotnetting.com/article/269/asp-net-5-middleware-o-where-has-my-httpmodule-gone – MatthewMartin

risposta

0

Penso che il tuo codice abbia un bell'aspetto, ma IIS non invia l'entità dell'intestazione da sola con una risposta prevista. Si prega di verificare se IIS è configurato correttamente.

  • Configurazione IIS6
  • Configurazione IIS7

Se CORS non funziona per il vostro problema particolarità, forse jsonp è un altro modo possibile.

+0

Forse json è un altro modo possibile. Come? – Coding4Fun

+1

Immagino che tu abbia erroneamente letto 'JSONP' come' JSON'. Una risposta JSONP è una stringa JSON standard racchiusa in una chiamata di funzione. Ogni browser moderno è in grado di valutare la risposta JSONP senza restrizione dei criteri di dominio di origine. Puoi trovare alcune soluzioni per C# come questo http://stackoverflow.com/questions/14221429/how-can-i-produce-jsonp-from-an-asp-net-web-service-for-cross-domain-calls – stanleyxu2005

7

vi consiglio di duplice controllo di aver eseguito tutti i passaggi in questa pagina: CORS on ASP.NET

Oltre a:

Response.AppendHeader("Access-Control-Allow-Origin", "*"); 

provare anche:

Response.AppendHeader("Access-Control-Allow-Methods","*"); 

/Prova ad aggiungere direttamente in web config:

<httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Methods" values="*" /> 
     <add name="Access-Control-Allow-Headers" values="Content-Type" /> 
    </customHeaders> 
    <httpProtocol> 

In caso contrario, è necessario assicurarsi di avere il controllo su entrambi i domini.

3

Se è necessaria la richiesta di verifica preliminare, ad es. in modo da poter inviare richieste autenticate, non è possibile impostare Access-Control-Allow-Origin: *. Deve essere un dominio specifico Origin.
Inoltre, è necessario impostare le intestazioni di risposta Access-Control-Allow-Methods e Access-Control-Allow-Headers, se si utilizza qualcosa oltre ai valori predefiniti.
(Nota: questi vincoli sono esattamente come funziona CORS stesso - è così che viene definito.)

Quindi, non è sufficiente per gettare solo l'attributo [EnableCors], è necessario impostare i valori ai parametri:

[EnableCors(origins: "https://www.olliejones.com", headers: "X-Custom-Header", methods: "PUT", SupportsCredentials = true)] 

O se volete fare le cose manualmente e in modo esplicito:

HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "https://www.olliejones.com"); 
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Headers", "X-Custom-Header"); 
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Methods", "PUT"); 
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Credentials", "true"); 

Un'ultima cosa: devi chiamare .EnableCors() al momento dell'iniziazione. Ad es. MVC o WebAPI, lo chiameresti su HttpConfiguration, quando registri la configurazione e così via, ma non ho idea di come funzioni con WebForms.

0

Se si utilizza il metodo AppendHeader per inviare intestazioni specifiche della cache e allo stesso tempo utilizzare il modello di oggetto cache (Cache) per impostare il criterio di cache, le intestazioni di risposta HTTP relative alla cache potrebbero essere eliminate quando il modello dell'oggetto cache è Usato. Questo comportamento consente a ASP.NET di mantenere le impostazioni più restrittive. Ad esempio, considera una pagina che include controlli utente. Se tali controlli hanno politiche di cache in conflitto, verrà utilizzata la politica cache più restrittiva. Se un controllo utente imposta l'intestazione "Cache-Control: Public" e un altro controllo utente imposta l'intestazione più restrittiva "Cache-Control: Private" tramite chiamate a SetCacheability, l'intestazione "Cache-Control: Private" verrà inviata con il risposta.

È possibile creare un httpProtocol in Web Config per CustomHeaders.

<httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Methods" values="*" />   
    </customHeaders> 
    <httpProtocol> 
0

Si può fare come questo in MVC

[EnableCors(origins: "*", headers: "*", methods: "*")] 
public ActionResult test() 
{ 
    Response.AppendHeader("Access-Control-Allow-Origin", "*"); 
    return View(); 
} 
0

Per il modulo web, è possibile utilizzare

Response.AddHeader ("Access-Control-Allow-Origin", "*");

invece di

Response.AppendHeader ("Access-Control-Allow-Origin", "*");

Il primo funziona per la versione precedente di ASP.Net Web Form.