2017-02-16 2 views
4

Борьба с CORS. У меня есть сайт, который делает простой XmlHttpRequest WEB API, который я создал на C#.C# WEB API CORS не работает

var xhr = new XMLHttpRequest(); 
    xhr.open("GET","https://server/controller/method", true); 
    xhr.send(); 

В моей web.config я сделал следующее:

<httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
    </customHeaders> 
</httpProtocol> 

Я также попытался установить пакет NuGet и выполнив следующие действия в моем WebApiConfig.cs

var cors = new EnableCorsAttribute(
      origins: "*", 
      headers: "*", 
      methods: "*"); 
     config.EnableCors(cors); 

Несмотря на эти усилия, CORS все еще не работают. В консоли FireFox, я получаю следующее сообщение об ошибке:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://server . This can be fixed by moving the resource to the same domain or enabling CORS.

IE также просто терпит неудачу и не дает никакой ошибки.

Согласно всем, что я прочитал, одно из этих решений должно работать, но они этого не делают. Должно ли быть включено/изменено в клиентском JavaScript? CORS не работает, когда вы запускаете его в Visual Studio IIS Express на localhost: PortNumber? Что мне не хватает?

+0

Происходит ли такая же проблема, когда вы запускаете ее через обычный http? –

+0

Я пытаюсь запустить его с сайта https, когда я пытаюсь просто обычным http, я получаю сообщение о смешанном контенте, и запрос никогда не делается. – Dave

+0

Попробуйте использовать почтальон. –

ответ

0

В клиенте JavaScript-код, вы можете попробовать добавить это:

xhr.withCredentials = true; 

Как указано в Firefox CORS request giving 'Cross-Origin Request Blocked' despite headers:

otherwise Firefox failed to use the client cert when making the request

Однако, если вы сделаете это изменение в коде клиента, вы будете также необходимо изменить ваш серверный код, поэтому значение Access-Control-Allow-Origin не равно *. Есть несколько способов сделать это ...

От конфигурации IIS, вы можете сделать это с URL Rewrite Module, добавив следующие строки в Web.config или ApplicationHost.config файл в %SystemDrive%\inetpub\wwwroot\.

<configuration> 
    <system.webServer> 
     <rewrite> 
      <outboundRules> 
       <rule name="Make Access-Control-Allow-Origin echo Origin"> 
        <match serverVariable="RESPONSE_Access-Control-Allow-Origin" 
          pattern=".+" negate="true" /> 
        <action type="Rewrite" value="{HTTP_ORIGIN}" /> 
       </rule> 
      </outboundRules> 
     </rewrite> 
    </system.webServer> 
</configuration> 

Если выше не работает, то вы можете попробовать версию в ответ на более CORS in IIS issue with credentials and wildcard in Access-Control-Allow-Origin.

Другой способ сделать это, in the global.asax or other code for your service, add something like this:

if (ValidateRequest()) { 
    Response.Headers.Remove("Access-Control-Allow-Origin"); 
    Response.AddHeader("Access-Control-Allow-Origin", Request.Headers["origin"]); 
    Response.Headers.Remove("Access-Control-Allow-Credentials"); 
    Response.AddHeader("Access-Control-Allow-Credentials", "true"); 
    Response.Headers.Remove("Access-Control-Allow-Methods"); 
    Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); 
} 

... наиболее важной частью этого является следующее:

Response.AddHeader("Access-Control-Allow-Origin", Request.Headers["origin"]); 

И если ни одна из этих работ, попробуйте an approach using Microsoft.AspNet.WebApi.Cors.

0

Вам нужно еще несколько строк в вашем web.config, чем у вас уже есть:

<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Headers" value="Content-Type" /> 
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> 
    <add name="Access-Control-Allow-Credentials" value="true" /> 
    </customHeaders> 
</httpProtocol> 

вы не можете просто сказать: «разрешить все», потому что все протоколы по умолчанию отключены, так что протоколы должны быть тоже, и если вы когда-либо пытаетесь сделать какой-либо метод входа по вашим запросам, я бы посоветовал Allow-Credentials, иначе эту строку можно удалить.

Вам также необходимо убедиться, что все это содержится в разделе system.webServer.

+0

Спасибо bizzehdee, но та же проблема возникает. Я проверил, что они также содержатся в разделах system.webServer. – Dave

Смежные вопросы