【发布时间】:2015-02-21 18:34:52
【问题描述】:
我有一个在某个端口上本地运行的 ASP.NET Web API,我有一个在 8080 上运行的 angularjs 应用程序。我想从客户端访问该 api。
我可以成功登录并注册我的应用程序,因为在我的 OAuthAuthorizationProvider 中明确设置了 /Token 端点中的响应头。
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
这很好。但是,我的其他 API 方法似乎不起作用。在我的 WebApiCongig.Register 中,我启用了 CORS,并将 EnableCors 属性添加到我的控制器以允许所有来源、所有标头和所有方法。我可以在控制器上的 get 方法中设置一个断点,它会被很好地击中。这是我在 chrome 中观看“网络”选项卡时发现的。
2 个请求被发送到同一个 api 方法。一种方法类型为 OPTIONS,另一种方法类型为 GET。 OPTIONS 请求头包含这两行
Access-Control-Request-Headers:接受、授权
访问控制请求方法:GET
响应包括这些行
访问控制允许标头:授权
访问控制允许来源:*
但是,GET 方法请求看起来完全不同。它返回 ok,状态码为 200,但它不包括请求或响应中的访问控制标头。就像我说的,它可以很好地访问 API。我什至可以做一个 POST 并保存到数据库,但是客户端抱怨响应!
我查看了每一个 SO 问题,并尝试了启用 cors 的每一种组合。我正在使用 Microsoft.AspNet.Cors 5.2.2 版。我正在使用 AngularJS 1.3.8 版。我也在使用 $resource 服务而不是 $http,这似乎也没有什么不同。
如果我能提供更多信息,请告诉我。
顺便说一句,我可以使用 Fiddler 和/或 Postman 访问 Web API,只需包含 Bearer 令牌。
【问题讨论】:
-
所以你的意思是它与邮递员/提琴手一起工作,而不是与角度合作
-
正确。我不确定它是否有角度,因为它是浏览器强制执行跨源请求。
-
你在你的 ngapp.config
myApp.config(function($httpProvider) { $httpProvider.defaults.useXDomain = true; delete $httpProvider.defaults.headers.common['X-Requested-With']; });987654322@中完成了这些设置 -
是的。但从我读到的内容来看,这些需要包含在旧版浏览器支持中。
-
通过使用 --disable-web-security 选项运行 chrome 来尝试它,如果它在 fiddler 中工作,它应该与上述设置一起工作,请确保您看到说明 web-security 已禁用的通知
标签: c# asp.net angularjs asp.net-web-api