Cors 在 web api2 项目中不起作用

Posted

技术标签:

【中文标题】Cors 在 web api2 项目中不起作用【英文标题】:Cors not working in web api2 project 【发布时间】:2017-05-28 14:05:05 【问题描述】:

您好,我正在开发 web api2 项目。我在服务器 192.168.0.213 中托管了应用程序,我正在尝试访问以下方法。

 this.getSubs = function () 
        var url = 'http://192.168.0.213:7777/api/User_Creation/';
        return $http.get(url).then(function (response) 
            return response.data;
        );
    

上面的函数返回没有问题的数据。 例如,我下面的带有 PUT、DELETE 和 POST 等动词的方法不起作用。

this.saveSubscriber = function (sub) 
        return $http(
            method: 'post',
            data: JSON.stringify(sub),
            url: 'http://192.168.0.213:7777/api/User_Creation/',
            contentType: "application/json"
        );
    

我尝试了很多方法仍然没有任何方法。目前我在 web.config 文件中有以下代码。

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

我在 webapiconfig.cs 文件中有以下代码行。

private static void EnableCrossSiteRequests(HttpConfiguration config)
        
            var cors = new EnableCorsAttribute(
                origins: "*",
                headers: "*",
                methods: "*");
            config.EnableCors(cors);
        

我在控制器中有以下代码行。仍然没有任何工作。

  [EnableCors(origins: "http://192.168.0.213:7777", headers: "*", methods: "*")]

我也评论了。我尝试了所有方法,只有 GET 动词可以正常工作。我的插入更新删除操作不起作用。我可以知道我在哪里做错了吗?我可以在这方面得到一些帮助,因为我尽了最大努力仍然没有运气.. 谢谢大家。

【问题讨论】:

它可能正在执行预检请求。请参阅 asp.net/web-api/overview/security/… 和 asp.net/web-api/overview/security/… 我在使用 MVC 时遇到了类似的问题,我不确定是什么问题。 谢谢。我得到以下错误。 MLHttpRequest 无法加载 192.168.0.54:8099/api/User_Creation/41。预检响应包含无效的 HTTP 状态代码 405 所以,我相信有一个 OPTION 动词被发送。一种可能的解决方法是不发送application/json 作为您的类型,根据***.com/a/22968724/2953322 【参考方案1】:

尝试这样的事情:(对我来说工作完美):

Startup.cs 文件:(install Microsoft.Owin.Cors nuget packages before)

using Goocity.API;
using Microsoft.Owin;
using Microsoft.Owin.Cors;
using Owin;

[assembly: OwinStartup("API", typeof(Goocity.API.Startup))]

namespace Goocity.API

    public partial class Startup
    
        public void Configuration(IAppBuilder app)
        
            #region TO UNCOMMENT WHEN IS IN PRODUCTION
            //var corsPolicy = new CorsPolicy
            //
            //    AllowAnyMethod = true,
            //    AllowAnyHeader = true,
            //    SupportsCredentials = true,
            //    Origins =  "http://www.mysite.it" 
            //;

            //app.UseCors(new CorsOptions
            //
            //    PolicyProvider = new CorsPolicyProvider
            //    
            //        PolicyResolver = context => Task.FromResult(corsPolicy)
            //    
            //);
            #endregion TO UNCOMMENT WHEN IS IN PRODUCTION

            app.UseCors(CorsOptions.AllowAll);
            ConfigureAuth(app);

        
    

然后你的 webconfig:(在 system.webserver 部分)

<system.webServer>
    <httpProtocol>
      <customHeaders>

        <add name="Access-Control-Allow-Credentials" value="true" />
        <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, X-Token, Cache-Control" />
        <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
      </customHeaders>
    </httpProtocol>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="WebDAVModule" />
      <remove name="FormsAuthentication" />
    </modules>
    <staticContent>
      <remove fileExtension=".woff" />
      <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
      <remove fileExtension=".woff2" />
      <mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />
      <remove fileExtension=".json" />
      <mimeMap fileExtension=".json" mimeType="application/json" />
    </staticContent>
    <!--<rewrite>
      <rules>
        <rule name="HTTP to HTTPS redirect" stopProcessing="true">
          <match url="(.*)" />
          <conditions>
            <add input="HTTPS" pattern="off" ignoreCase="true" />
          </conditions>
          <action type="Redirect" redirectType="Found" url="https://HTTP_HOST/R:1" />
        </rule>

      </rules>
    </rewrite>-->

    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>

  </system.webServer>

希望对你有帮助!!...

【讨论】:

【参考方案2】:

你应该有[EnableCors(origins: "http://192.168.0.54", headers: "*", methods: "*")],换句话说,你的EnableCors应该指定客户端尝试连接,而不是服务器本身

【讨论】:

每当我通过邮递员192.168.0.213:7777/api/User_Creation/41 提出以下删除请求时,它都可以正常工作。似乎很奇怪。在下面的邮递员中,我可以看到 Access-Control-Allow-Methods →POST,GET,PUT,DELETE Access-Control-Allow-Origin →* 我可以知道这里有什么问题吗? 通过 Postman 运行是无关紧要的,因为它不涉及 CORS。您没有提到您是否还在Register() 中启用了 CORS。看看这里:asp.net/web-api/overview/security/… 了解更多详细信息,看看您的代码与参考实现有何不同

以上是关于Cors 在 web api2 项目中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

CORS 在独立的 tomcat 中不起作用

带有 CORS 和 Angular 的 .NET Web API 2 在第一篇文章中不起作用

CORS 过滤器在我的 Java 应用程序中不起作用

使用 Java Config 的全局 CORS 配置在 Spring MVC 中不起作用

CORS 在 Firefox 中不起作用

CORS 在 Django 中不起作用,但设置似乎正确