Eu tenho um método de ação simples, que retorna algum json. É executado em ajax.example.com. Preciso acessar isso em outro site someothersite.com.
Se eu tentar chamá-lo, recebo o esperado ...:
Origin http://someothersite.com is not allowed by Access-Control-Allow-Origin.
Conheço duas maneiras de contornar isso: JSONP e criar um HttpHandler personalizado para definir o cabeçalho.
Não existe uma maneira mais simples?
Não é possível para uma ação simples definir uma lista de origens permitidas - ou simplesmente permitir a todos? Talvez um filtro de ação?
O ideal seria ...:
return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);
json
asp.net-mvc-3
cors
asp.net-ajax
Kjensen
fonte
fonte
Respostas:
Para controladores ASP.NET MVC simples
Crie um novo atributo
Etiquete sua ação:
Para API da Web do ASP.NET
Etiquete um controlador de API inteiro:
Ou chamadas de API individuais:
Para Internet Explorer <= v9
O IE <= 9 não suporta CORS. Eu escrevi um javascript que encaminhará automaticamente essas solicitações por meio de um proxy. É tudo 100% transparente (você só precisa incluir meu proxy e o script).
Faça o download usando pepitas
corsproxy
e siga as instruções incluídas.Postagem no blog | Código fonte
fonte
Se você estiver usando o IIS 7+, poderá colocar um arquivo web.config na raiz da pasta, na seção system.webServer:
Consulte: http://msdn.microsoft.com/en-us/library/ms178685.aspx E: http://enable-cors.org/#how-iis7
fonte
Encontrei um problema em que o navegador se recusava a exibir o conteúdo recuperado quando a solicitação passava nos cookies (por exemplo, o xhr tinha o seu
withCredentials=true
) e o site estavaAccess-Control-Allow-Origin
definido como*
. (O erro no Chrome foi: "Não é possível usar curinga no Access-Control-Allow-Origin quando o sinalizador de credenciais for verdadeiro.")Com base na resposta de @jgauffin, eu criei isso, que é basicamente uma maneira de contornar essa verificação de segurança do navegador em particular, portanto, faça uma advertência ao emptor.
fonte
Isso é realmente simples, basta adicionar isso no web.config
Em Origin, coloque todos os domínios que têm acesso ao servidor da Web, nos cabeçalhos, todos os cabeçalhos possíveis que qualquer solicitação http ajax pode usar; nos métodos, coloque todos os métodos que você permitir no servidor.
Saudações :)
fonte
Às vezes, o verbo OPTIONS também causa problemas
Simplesmente: Atualize seu web.config com o seguinte
E atualize os cabeçalhos de serviço da web / controlador com httpGet e httpOptions
fonte
O WebAPI 2 agora possui um pacote para CORS que pode ser instalado usando: Pacote de Instalação Microsoft.AspNet.WebApi.Cors -pre -project WebServic
Depois de instalado, siga o código: http://www.asp.net/web-api/overview/security/enabled-cross-origin-requests-in-web-api
fonte
Adicione esta linha ao seu método, se você estiver usando uma API.
fonte
Este tutorial é muito útil. Para dar um resumo rápido:
Use o pacote CORS disponível no Nuget:
Install-Package Microsoft.AspNet.WebApi.Cors
No seu
WebApiConfig.cs
arquivo, adicioneconfig.EnableCors()
aoRegister()
métodoAdicione um atributo aos controladores necessários para lidar com cors:
[EnableCors(origins: "<origin address in here>", headers: "*", methods: "*")]
fonte
fonte
Outra maneira é adicionar código como abaixo no arquivo webApiconfig.cs.
config.EnableCors (new EnableCorsAttribute (" ", cabeçalhos: " ", métodos: "*" ,posedHeaders: "TestHeaderToExpose") {SupportsCredentials = true});
Ou podemos adicionar o código abaixo no arquivo Global.Asax.
Eu escrevi para as opções. Modifique o mesmo conforme sua necessidade.
Feliz codificação !!
fonte
Depois de lutar por uma noite inteira, finalmente consegui que isso funcionasse. Após alguma depuração, encontrei o problema em que estava encontrando o problema: meu cliente estava enviando uma solicitação de opções de preflight para verificar se o aplicativo tinha permissão para enviar uma solicitação de postagem com a origem, métodos e cabeçalhos fornecidos. Como não queria usar o Owin ou um APIController, comecei a cavar e criei a seguinte solução com apenas um ActionFilterAttribute. Especialmente a parte "Controle de acesso-Permitir cabeçalhos" é muito importante, pois os cabeçalhos mencionados lá precisam corresponder aos cabeçalhos que sua solicitação enviará.
Finalmente, meu método de ação MVC se parece com isso. Importante aqui é também mencionar as Opções HttpVerbs, porque, caso contrário, a solicitação de comprovação falhará.
fonte
Em Web.config, digite o seguinte
fonte
Se você usa o IIS, sugiro tentar o módulo IIS CORS .
É fácil de configurar e funciona para todos os tipos de controladores.
Aqui está um exemplo de configuração:
fonte
Estou usando o DotNet Core MVC e depois de lutar por algumas horas com pacotes de nuget, Startup.cs, atributos e este local, simplesmente adicionei isso à ação MVC:
Sei que isso é bastante desajeitado, mas é tudo que eu precisava e nada mais queria adicionar esses cabeçalhos. Espero que isto ajude alguém!
fonte