Angular.js $resource 与 ASP.Net webapi?
Posted
技术标签:
【中文标题】Angular.js $resource 与 ASP.Net webapi?【英文标题】:Angular.js $resource with ASP.Net webapi? 【发布时间】:2014-12-14 09:06:54 【问题描述】:我有一个简单的 ASP.Net WebAPI 服务,它在 POST/PUT 上分配一个静态变量并在 GET 上返回值:
private static State Repo = null;
public State Get()
return Repo;
public void Post(State value)
Repo = value;
public void Put(State value)
Repo = value;
我有一个这样定义的角度资源:
var stateService = angular.module('StateService', ['ngResource']);
stateService.factory('State', function ($resource)
return $resource('http://localhost:8080/API/State');
);
当我尝试这样做时:
State.get(function (state)
$scope.data = state.data !== undefined ? state.data : '[Not Set]';
state.data = "newvalue";
state.$save();
);
get()
工作正常,但 $save()
在 chrome 中抛出此错误:
XMLHttpRequest cannot load http://localhost:8080/API/State. Invalid HTTP status code 405
webAPI 已经启用了 CORS(返回 Access-Control-Allow-Origin: *
)。我错过了什么?
【问题讨论】:
【参考方案1】:对于某些 CORS 请求,浏览器会在发送对资源的实际请求之前发送一个额外的请求,称为“预检请求”。
pre-flight 请求使用 HTTP OPTIONS(405 状态码)方法。它包括两个特殊的标题:
Access-Control-Request-Method:将用于的 HTTP 方法 实际请求。 Access-Control-Request-Headers:请求列表 应用程序在实际请求中设置的标头。 (再次,这 不包括浏览器设置的标头。)即使您已启用 CORS,并且它适用于 GET
请求,并且您已告知它正在为 POST
请求显示 405 HTTP Status
。这是因为,POST,PUT,DELETE
请求不是安全请求,他们首先发送请求 OPTIONS
请求,您必须响应 Access-Control-Allow-Origin: *
、Access-Control-Allow-Methods: POST
等所需的 hedaers,然后它会再次发送 POST
请求,然后它将起作用。
请验证您发送的响应标头是什么。即要成功发送CORS POST
请求,至少您必须发送Access-Control-Allow-Methods: POST
和Access-Control-Allow-Origin: *
。
启用 CORS 的步骤:
-
安装这个 - 使用 NuGet 安装包 Microsoft.AspNet.WebApi.Cors
打开文件 App_Start/WebApiConfig.cs。将以下代码添加到 WebApiConfig.Register 方法中。
接下来,将 [EnableCors] 属性添加到 Controller 类:
有以下参数
[EnableCors(origins: "your_domain", headers: "*", methods: "POST")]
重新部署您的 WebAPI 项目。
来源 - http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
更多链接 - http://www.codeproject.com/Articles/742532/Using-Web-API-Individual-User-Account-plus-CORS-En
【讨论】:
对于 CORS 请求,PUT、POST、DELETE 不起作用,直截了当,它会首先向您发送 405OPTIONS
请求,然后您必须响应上述标头,然后将工作。我已经回答了这个问题 - ***.com/questions/25889599/…,但这是给 WCF 的,我正在寻找 WebAPI
,很快就会发布。你也发送这个 Access-Control-Allow-Methods: POST
标头吗?
有没有办法从 IIS 做到这一点?我尝试将它们添加到 IIS,但它们没有效果。但是,当我将它们添加到 webAPI 代码中时,它们就像一个魅力。
你需要给post方法设置一些属性,比如methods
,headers
,那么它应该可以工作。
谢谢,试试看! :)
@ArindamNayak,如果 CORS 由 EnableCorsAttribute("*", "*", "*");
启用,那么是否必须明确指定“POST”?另外,我尝试在 web.config 中启用它,但这不起作用.. 有什么解释吗?【参考方案2】:
在 Web.config 上,在
处注释<remove name="OPTIONSVerbHandler" />
行
<system.webServer>
<handlers>
如果您通过 web.config 文件使用 CORS 配置。
【讨论】:
以上是关于Angular.js $resource 与 ASP.Net webapi?的主要内容,如果未能解决你的问题,请参考以下文章
angular-resource.js encodeUriSegment 问题
如何使用 angular.js-resource 启用 cors 请求