Recentemente, deparei com a postagem de solicitações de Javascript para outro domínio. Por padrão, a postagem XHR em outros domínios não é permitida.
Seguindo as instruções de http://enable-cors.org/ , habilitei isso no outro domínio.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
Tudo funciona bem agora, no entanto, ainda é retornar uma resposta 405 antes de enviar de volta a resposta 200 de trabalho.
Request URL:http://testapi.nottherealsite.com/api/Reporting/RunReport
Request Method:OPTIONS
Status Code:405 Method Not Allowed
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Access-Control-Request-Headers:origin, content-type, accept
Access-Control-Request-Method:POST
Connection:keep-alive
Host:testapi.nottherealsite.com
Origin:http://test.nottherealsite.com
Referer:http://test.nottherealsite.com/Reporting
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
Response Headersview source
Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Methods:GET,PUT,POST,DELETE,OPTIONS
Access-Control-Allow-Origin:*
Allow:POST
Cache-Control:private
Content-Length:1565
Content-Type:text/html; charset=utf-8
Date:Tue, 18 Sep 2012 14:26:06 GMT
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
Atualização: 02/03/2014
Há um artigo atualizado recentemente na revista MSDN. Detalhando o suporte a CORS na API Web ASP.NET 2.
javascript
iis-7
xmlhttprequest
cors
Andrew
fonte
fonte
Respostas:
Provavelmente é o caso do IIS 7 'manipulando' a resposta OPÇÕES HTTP em vez de seu aplicativo especificá-la. Para determinar isso, no IIS7,
Acesse Mapeamentos de manipulador de seu site.
Role para baixo até 'OPTIONSVerbHandler'.
Altere o 'ProtocolSupportModule' para 'IsapiHandler'
Defina o executável:% windir% \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_isapi.dll
Agora, suas entradas de configuração acima devem ser ativadas quando um verbo HTTP OPTIONS for enviado.
Como alternativa, você pode responder ao verbo HTTP OPTIONS em seu método BeginRequest.
fonte
Application_BeginRequest
foi a única maneira de resolver o problema. Tentei outros métodos usandocustomHeaders
( stackoverflow.com/a/19091291/827168 ), removendoOPTIONSVerbHandler
manipulador, removendoWebDAV
módulo e manipulador ( stackoverflow.com/a/20705500/827168 ), mas nenhum funcionou para mim. Espero que isso ajude outras pessoas. E obrigado @Mendhak pela sua resposta!HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
por causa do cookie de autenticação compartilhado.Não posso postar comentários, então tenho que colocar isso em uma resposta separada, mas está relacionado à resposta aceita por Shah.
Eu inicialmente segui a resposta de Shahs (obrigado!), Reconfigurando o OPTIONSVerbHandler no IIS, mas minhas configurações foram restauradas quando reimplantei meu aplicativo.
Acabei removendo o OPTIONSVerbHandler em meu Web.config.
fonte
Eu encontrei a informação encontrada em http://help.infragistics.com/Help/NetAdvantage/jQuery/2013.1/CLR4.0/html/igOlapXmlaDataSource_Configuring_IIS_for_Cross_Domain_OLAP_Data.html são muito úteis na configuração de OPÇÕES HTTP para um serviço WCF no IIS 7.
Eu adicionei o seguinte ao meu web.config e movi OPTIONSVerbHandler da lista de 'mapeamentos de manipuladores' do IIS 7 para o topo da lista. Eu também dei ao OPTIONSVerbHander acesso de leitura clicando duas vezes no manipulador na seção de mapeamentos do manipulador, em 'Solicitar Restrições' e clicando na guia de acesso.
Infelizmente, descobri rapidamente que o IE não parece suportar a adição de cabeçalhos ao seu XDomainRequest objeto (definindo Content-Type como text / xml e adicionando um cabeçalho SOAPAction).
Só queria compartilhar isso, pois passei a maior parte do dia procurando como lidar com isso.
fonte
<add name="Access-Control-Allow-Origin" value="http://my.origin.host" />
A resposta 405 é uma resposta "Método não permitido". Parece que seu servidor não está configurado corretamente para lidar com solicitações de comprovação CORS. Você precisa fazer duas coisas:
1) Ative o IIS7 para responder às solicitações HTTP OPTIONS. Você está obtendo o 405 porque o IIS7 está rejeitando a solicitação OPTIONS. Não sei como fazer isso porque não estou familiarizado com o IIS7, mas provavelmente há outros no Stack Overflow que fazem.
2) Configure seu aplicativo para responder às solicitações de comprovação do CORS. Você pode fazer isso adicionando as duas linhas a seguir abaixo da
Access-Control-Allow-Origin
linha na<customHeaders>
seção:Você pode ter que adicionar outros valores ao
Access-Control-Allow-Headers
seção com base nos cabeçalhos que sua solicitação está solicitando. Você tem o código de amostra para fazer uma solicitação?Você pode aprender mais sobre CORS e preflight CORS aqui: http://www.html5rocks.com/en/tutorials/cors/
fonte
Elaborando a partir da resposta DavidG que está realmente próxima do que é necessário para uma solução básica:
Primeiro, configure o OPTIONSVerbHandler para executar antes dos manipuladores .Net.
Você também pode fazer isso em web.config redefinindo todos os manipuladores em
<system.webServer><handlers>
(e<clear>
depois<add ...>
eles de volta, isso é o que o console IIS faz para você) (a propósito, não há necessidade de solicitar permissão de "leitura" neste manipulador.)Em segundo lugar, configure cabeçalhos http personalizados para suas necessidades de cors, como:
Você também pode fazer isso no console do IIS.
Esta é uma solução básica, uma vez que envia cabeçalhos cors mesmo a pedido que não o requeira. Mas com o WCF, parece ser o mais simples.
Com MVC ou webapi, poderíamos, em vez disso, lidar com os cabeçalhos OPTIONS verbo e cors por código ("manualmente" ou com suporte integrado disponível na versão mais recente do webapi).
fonte
Com ASP.net Web API 2 instale o suporte Microsoft ASP.NET Cross Origin via nuget.
http://enable-cors.org/server_aspnet.html
fonte
programmatically
definir o primeiro parâmetro "ORIGIN" deEnableCorsAttribute
? Digamos que não aqui no Registro, mas para cada solicitação HTTP individual que chega. Detecte a origem de onde está vindo, certifique-se de que está OK (compare com alguma lista de aprovados) e retorne uma resposta comAccess-Allow-Control-Origin="thatdomain.com"
? @AndrewA solução para mim foi adicionar:
Para meu web.config
fonte
Alsalaam Aleykum.
A primeira maneira é seguir as instruções neste link:
http://help.infragistics.com/Help/NetAdvantage/jQuery/2013.1/CLR4.0/html/igOlapXmlaDataSource_Configuring_IIS_for_Cross_Domain_OLAP_Data.html
Que corresponde a estas configurações:
A segunda maneira é responder ao verbo HTTP OPTIONS em seu método BeginRequest.
fonte
A Microsoft levou anos para identificar as lacunas e lançar um módulo CORS fora de banda para resolver esse problema.
como abaixo
Em geral, é muito mais fácil do que seus cabeçalhos personalizados e também oferece melhor tratamento de solicitações de comprovação.
fonte
Uma coisa que não foi mencionada nessas respostas é que se você estiver usando o IIS e tiver subaplicativos com seus próprios web.config separados, pode ser necessário ter um web.config no diretório pai contendo o código a seguir.
fonte