Cors 不适用于删除和放入 web api2
Posted
技术标签:
【中文标题】Cors 不适用于删除和放入 web api2【英文标题】:Cors not working for Delete and Put in web api2 【发布时间】:2017-05-31 00:37:37 【问题描述】:一周以来,我一直在 CORS 问题上苦苦挣扎。我正在使用 web api2 编写 web 服务。我创建了一个控制器(用于基本的 crud 操作)并托管在服务器 192.168.0.213:8041/api/user_creation 中,我创建了另一个 mvc5 应用程序并托管在与 http://192.168.0.213:8040/usercreation/Index 相同的服务器中。我已经使用下面的链接启用了 cors。
http://www.c-sharpcorner.com/UploadFile/009ee3/implementation-of-cross-origin-request-in-Asp-Net-web-api-2/
我正在使用 angularjs 来获取如下服务。我能够从服务器获取数据,也能够将数据推送到服务器。所以我的 GET 和 POST 动词工作正常。每当我尝试更新和删除时,我都会遇到问题并收到以下错误消息。
Failed to load resource: the server responded with a status of 405 (Method Not Allowed) http://192.168.0.213:8041/User_Creation/1020
XMLHttpRequest cannot load http://192.168.0.213:8041/User_Creation/1020. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://192.168.0.213:8040' is therefore not allowed access. The response had HTTP status code 405.
我正在使用 angularjs 来调用 Web 服务,如下所示。 例如更新,
this.update = function (sub)
var url = 'http://192.168.0.213:8041/User_Creation/' + sub.user_id;
return $http(
method: 'put',
data: JSON.stringify(sub),
url: url,
contentType: "application/json"
);
对于删除,
this.deleteSubscriber = function (user_id)
var url = 'http://192.168.0.213:8041/User_Creation/' + user_id;
return $http.delete(url).then(function (response)
return response.data;
);
我从 Web Api 接收 json 格式的数据,所以我在 global.asx 中添加了以下代码。 GlobalConfigGlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters
.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
这是我在 web.config 中的处理程序代码
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
以下是请求和响应数据。
Request URL: http://192.168.0.213:8041/User_Creation/1021
Request Method: DELETE
Status Code: 405 / Method Not Allowed
- Request Headers
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US
Cache-Control: no-cache
Connection: Keep-Alive
Content-Length: 0
Host: 192.168.0.213:8041
Referer: http://192.168.0.213:8040/usercreation/Index
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
- Response Headers
Allow: GET, HEAD, OPTIONS, TRACE
Content-Length: 1293
Content-Type: text/html
Date: Mon, 16 Jan 2017 08:34:30 GMT
Server: Microsoft-IIS/8.5
X-Powered-By: ASP.NET
我在使用 PUT 和 Delete 方法时遇到问题。我可以得到一些帮助吗?有人可以告诉我我在哪里做错了吗?谢谢。
【问题讨论】:
检查响应头中的Access-Control-Allow-Methods
谢谢。当我点击删除时,我会得到一些细节。我在上面发布了,但我不明白我错过了什么。
您能展示您的 Web API 控制器操作吗?
我将控制器装饰如下。 [EnableCors(origins: "192.168.0.213:8040", headers: "Content-Type", methods: "GET, POST, PUT, DELETE, OPTIONS")] 下面是我的 put 和 delete 方法。 public IHttpActionResult Put(int id, Noor_Users users) [AcceptVerbs("DELETE")] public IHttpActionResult Delete(int id) .
在响应头中我只能看到允许:GET、HEAD、OPTIONS、TRACE。所以我这里没有 PUT 和 delete ?所以这在这里造成了问题?
【参考方案1】:
您的 Web 服务器上似乎不允许使用 PUT
和 DELETE
动词,并且您遇到的问题与 CORS 完全无关。您可能需要检查几件事以确保首先允许这些动词。在尝试进行跨域 AJAX 调用之前,请确保您可以对 Web API 进行标准 HTTP 调用并且它可以响应这些动词。
所以在你的 web.config 中你可能有这样的东西:
add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
注意这里没有PUT
和DELETE
动词。
还要确保您已从 web.config 中删除所有 WebDAV
和 WebDAVModule
跟踪,因为这可能会干扰您的请求:
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
</modules>
现在您可以使用 Postman 或 Fiddler 使用 PUT 和 DELETE 动词成功调用您的 Web API 端点,您可以返回到 javascript 尝试。
【讨论】:
谢谢。我会把我拥有的东西放在处理程序中。 您尝试添加<remove name="WebDAVModule"/>
行吗?
我刚刚更改为verb="GET,HEAD,POST,PUT,DELETE,DEBUG",现在开始正常工作并且发布不工作和删除。
现在我所有的动词在 IE 中都可以正常工作,但在 chrome 中却不行。
从 Postman/Fiddler 调用时,PUT 和 DELETE API 端点是否正常工作?以上是关于Cors 不适用于删除和放入 web api2的主要内容,如果未能解决你的问题,请参考以下文章
通过 Web.config 启用 CORS 不适用于 .net WebApi