C#WEB API CORS不起作用

Dav*_*ave 5 javascript c# cors asp.net-web-api

与CORS战斗.我有一个网站正在为我在C#中构建的WEB API创建一个简单的XmlHttpRequest.

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

在我的web.config中,我完成了以下操作:

<httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
    </customHeaders>
</httpProtocol>
Run Code Online (Sandbox Code Playgroud)

我还尝试安装Nuget包并在我的WebApiConfig.cs中执行以下操作

var cors = new EnableCorsAttribute(
            origins: "*",
            headers: "*",
            methods: "*");
        config.EnableCors(cors);
Run Code Online (Sandbox Code Playgroud)

尽管做了这些努力,CORS仍然无效.在FireFox控制台中,我收到以下错误:

跨源请求已阻止:同源策略不允许在https:// server上读取远程资源.这可以通过将资源移动到同一域或启用CORS来解决.

IE也只是失败并且没有错误.

根据我读过的所有内容,其中一个解决方案应该可以工作,但事实并非如此.是否需要在客户端JavaScript中启用/更改某些内容?在localhost上运行Visual Studio IIS Express时,CORS不起作用:PortNumber?我错过了什么?

sid*_*ker 2

在您的客户端 JavaScript 代码中,您可以尝试添加以下内容:

\n
xhr.withCredentials = true;\n
Run Code Online (Sandbox Code Playgroud)\n

正如Firefox 的“跨源请求被阻止”中所示,尽管有标头:

\n
\n

否则 Firefox 在发出请求时无法使用客户端证书

\n
\n

但是,如果您对客户端代码进行更改,您还必须更改服务器端代码,因此 的值Access-Control-Allow-Origin不是*。有几种方法可以做到这一点\xe2\x80\xa6

\n

在 IIS 配置中,您可以使用URL 重写模块来完成此操作,方法是将以下内容添加到您的Web.config或.ApplicationHost.config%SystemDrive%\\inetpub\\wwwroot\\

\n
xhr.withCredentials = true;\n
Run Code Online (Sandbox Code Playgroud)\n

如果上述方法不起作用,那么您可以尝试在 IIS 中的 CORS 问题中使用 Access-Control-Allow-Origin 中的凭据和通配符的答案中的版本。

\n

另一种方法:global.asax您的服务的代码或其他代码中,添加如下内容

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

...其中最重要的部分是:

\n
Response.AddHeader("Access-Control-Allow-Origin", Request.Headers["origin"]);\n
Run Code Online (Sandbox Code Playgroud)\n

如果这些都不起作用,请尝试使用Microsoft.AspNet.WebApi.Cors.

\n