针对预检的响应具有无效的HTTP状态代码405
我已经阅读了*中的许多类似问题,但该解决方案对我无效。针对预检的响应具有无效的HTTP状态代码405
我有WCF REST服务:
[<OperationContract>]
[<WebInvoke(UriTemplate = "PostItem",
RequestFormat= WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json, Method = "POST")>]
我可以用邮差(Chrome扩展)使用它。我将数据传递为“原始”,而不是“urlencoded”。我得到200个返回码。
我需要使用angularjs调用这个方法:
$http.post('http://192.168.1.65/Service1.svc/restapi/PostItem',
{
"Address": "г. Москва, ул. Соколово-Мещерская, д.25",
...
"User": ""
})
我刚才复制的网址和JSON从邮差。但我得到的错误:
angular.js:10722 OPTIONS http://192.168.1.65/Service1.svc/restapi/PostItem http://192.168.1.65/Service1.svc/restapi/PostItem . Response for preflight has invalid HTTP status code 405
我已经寻找类似的问题,并发现两个解决方案:
- 使用jQuery设置标题
Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
,但它并没有与我的WCF服务 - 工作在我的web.config
设置自定义标题:
<httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Headers" value="Content-Type" /> <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> </customHeaders> </httpProtocol>
它不能帮助我。我不确定服务器端的错误原因。邮递员扩展可以成功调用此方法。
如何使用AngularJS进行相同的POST调用?
更新:
这里是OPTIONS请求:
审查和Response选项卡是空
更新2:
一切工作正常,在IE ,但不起作用Chrome浏览器。
看起来像我找到解决方案。我刚刚添加第二种方法:
[<OperationContract>]
[<WebInvoke(UriTemplate = "PostTest",
RequestFormat= WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json, Method = "POST")>]
abstract PostTest: obj: Test -> unit
[<OperationContract>]
[<WebInvoke(UriTemplate = "PostTest",
RequestFormat= WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json, Method = "OPTIONS")>]
abstract PostTestOptions: unit -> unit
这只是空白的方法,什么都不做。我不知道原因,但一切正常。
它的工作原理是因为您的web.config中已经有customHeaders,它返回了COR期望的内容,但是您没有允许OPTIONS的uriTemplate。因此,在创建了一个emtpy方法之后,预检可以正常工作,并从customHeaders中获取了已排除的标题。 –
在尝试了一个月的其他建议后,这个工作对我来说,开启和关闭,没有成功。 – quilkin
这有效,但我认为你可以将现有方法更改为Method =“OPTIONS”而不重复。它仍会发布数据。 – masospaghetti
即使已关闭的问题,我想展示我的工作。
首先,您必须在网络上启用CORS。配置(如米哈伊伤心):
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
如果你有一些额外的头参数,则必须将其添加到访问控制,允许报头,如:
<add name="Access-Control-Allow-Headers" value="Content-Type, X-Your-Extra-Header-Key" />
最后,处理OPTIONS请求您必须回复空的响应,添加您的应用程序类:
protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.Flush();
}
}
我越来越同样的错误在ASP网络API api 4.做什么请建议 –
我有时遇到了一些DLL文件损坏。你有办法测试服务器是否有退货吗?它发生在你所做的每一个电话中,还是仅仅在某些情况下? –
简单的$ .ajax调用工作正常,但从$ http(angularjs模块)发出请求时发出此错误..我发布了一个关于此问题:http://*.com/questions/37629422/angularjs-with -asp-net-web-api-http-post-returning-xmlhttprequest-can not-load?noredirect = 1#comment62740684_37629422 –
虽然这已经有一个答案,但是继承人我的解决方案。 在web配置您必须删除指令<remove name="OPTIONSVerbHandler" />
首先添加在customHeaders
<httpProtocol>
<!-- THESE HEADERS ARE IMPORTANT TO WORK WITH CORS -->
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="POST, PUT, DELETE, GET, OPTIONS" />
<add name="Access-Control-Allow-Headers" value="content-Type, accept, origin, X-Requested-With, X-Authentication, name" />
</customHeaders>
</httpProtocol>
接着是被注释掉或删除指令删除OPTIONSverbHandler
<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>
由于IIS团队发布IIS CORS module不再需要像空方法一样的黑客行为。它适当地处理CORS包括预检请求。你可以在Web配置中配置它,例如:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<cors enabled="true" failUnlistedOrigins="true">
<add origin="*" />
<add origin="https://*.microsoft.com"
allowCredentials="true"
maxAge="120">
<allowHeaders allowAllRequestedHeaders="true">
<add header="header1" />
<add header="header2" />
</allowHeaders>
<allowMethods>
<add method="DELETE" />
</allowMethods>
<exposeHeaders>
<add header="header1" />
<add header="header2" />
</exposeHeaders>
</add>
<add origin="http://*" allowed="false" />
</cors>
</system.webServer>
</configuration>
通常.Net将发送错误信息及405状态码......你有没有收到? –
我已更新我的问题,并在Chrome中添加此请求的屏幕。 – demas
否,在您发布的更新图片中查看,选中“预览”标签 –