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 和 Angular 的 .NET Web API 2 在第一篇文章中不起作用