The requested resource does not support http method 'OPTIONS'.?
我从angular.js客户端向asp.net web api PUT方法发出以下请求:
1 2 3 4 5 6 7 8 | var org = { OrgId: 111, name: 'testing testing' }; $http.put("http://localhost:54822/api/data/putorganisation/1/", org).then(function(status) { console.log("success PUT"); return status.data; }); |
但是获得以下errormsg(在fiddler中):
1 | {"message":"The requested resource does not support http method 'OPTIONS'."} |
这是我的asp.net web api web.config文件的一部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <system.webServer> <httpProtocol> <customHeaders> </customHeaders> </httpProtocol> <validation validateIntegratedModeConfiguration="false" /> <handlers> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <remove name="OPTIONSVerbHandler" /> <remove name="TRACEVerbHandler" /> <remove name="WebDAV" /> </handlers> <modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule" /> </modules> </system.webServer> |
数据控制器web api:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public HttpResponseMessage Options() { var response = new HttpResponseMessage(); response.StatusCode = HttpStatusCode.OK; return response; } public HttpResponseMessage PutOrganisation(int id, [FromBody]Organisation org) { var opStatus = _Repository.UpdateOrganisation(org); if (opStatus.Status) { return Request.CreateResponse<Organisation>(HttpStatusCode.Accepted, org); } return Request.CreateErrorResponse(HttpStatusCode.NotModified, opStatus.ExceptionMessage); } |
这是我的问题:为什么我在fiddler(工程)中使用与angularclient(不起作用)完全相同的请求时得到errormsg(见上文)?
我知道这是一个老问题,但我遇到了同样的问题,并认为我可以帮助其他人试图找出答案。
我通过删除Web.config中的2个处理程序配置解决了这个问题:
1 2 3 4 5 6 | <handlers> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <!--<remove name="OPTIONSVerbHandler" />--> <remove name="TRACEVerbHandler" /> <!----> </handlers> |
我不知道为什么它解决了这个问题,但我的工作原理是
在fiddler中,我假设它只发送PUT请求(我使用Postman Web应用程序手动发送请求时观察到相同的行为)。因此它会跳过禁止的OPTIONS请求并成功。
我也遇到了同样的问题,经过一些研究,我对web.config和Global.asax.cs文件进行了以下更改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <configuration> <system.webServer> <directoryBrowse enabled="true" /> <validation validateIntegratedModeConfiguration="false" /> <httpProtocol> <customHeaders> </customHeaders> </httpProtocol> <handlers> <remove name="WebDAV" /> <remove name="OPTIONSVerbHandler"/> <remove name="TRACEVerbHandler" /> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> </handlers> <modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule" /> <remove name="ApplicationInsightsWebTracking" /> </modules> </system.webServer> </configuration> |
添加以下代码global.ascx.cs
1 2 3 4 5 6 7 8 9 10 | protected void Application_BeginRequest() { if (HttpContext.Current.Request.HttpMethod =="OPTIONS") { HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods","GET, POST, PUT, PATCH, DELETE, OPTIONS"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept"); HttpContext.Current.Response.AddHeader("Access-Control-Max-Age","1728000"); HttpContext.Current.Response.End(); } } |
是的,老人但是好东西。我有同样的问题和症状,但我的解决方案是自己造成的。无论如何我会分享它。我们的服务配置启动时在所有
安德鲁是对的,这很可能是一个CORS问题。您需要的是将
1 2 3 4 | [EnableCors(origins:"https://example.com,http://example.org", headers:"*", methods:"*")] public class TestController : ApiController { // your code |
在此堆栈溢出帖子中提到了执行此操作的另一种方法
这几乎肯定是一个CORS问题。我首先要了解它,以确保您了解这是什么以及为什么它很重要。我猜你的服务器配置不正确。
不幸的是,我对.net知之甚少,但是.net的CORS教程描述了你应该做的很清楚。
看起来您缺少
显然,在某些情况下,OPTIONS请求在"真实"请求之前发送,以确定真实请求是否因CORS而安全发送。请参阅以下MS文章:http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api并搜索"预检请求"。
以下一些问答也可能有所帮助:
- jQuery $ .ajax(),$。post在Firefox中将"OPTIONS"作为REQUEST_METHOD发送
- Chrome中的AJAX发送OPTIONS而不是GET / POST / PUT / DELETE?
- 为什么这个jQuery AJAX PUT在Chrome中工作但不在FF中工作
- 如何在ASP.NET MVC / WebAPI应用程序中支持HTTP OPTIONS动词