Javascript 飞行前的响应具有无效的HTTP状态代码405
我在StackOverflow中读到了许多类似的问题,但解决方案对我来说并不适用 我有WCF休息服务:Javascript 飞行前的响应具有无效的HTTP状态代码405,javascript,angularjs,wcf,rest,Javascript,Angularjs,Wcf,Rest,我在StackOverflow中读到了许多类似的问题,但解决方案对我来说并不适用 我有WCF休息服务: [<OperationContract>] [<WebInvoke(UriTemplate = "PostItem", RequestFormat= WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST"
[<OperationContract>]
[<WebInvoke(UriTemplate = "PostItem",
RequestFormat= WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json, Method = "POST")>]
我刚刚从邮递员那里复制了URL和JSON。但我得到了一个错误:
js:10722选项
. 回应
飞行前的HTTP状态代码405无效
我搜索了类似的问题,找到了两种解决方案:
内容类型“:”application/x-www-form-urlencoded;charset=UTF-8'
,但它不适用于我的WCF服务<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>
“审阅”和“响应”选项卡为空
更新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
[]
[]
测试后摘要:obj:测试->单元
[]
[]
抽象测试选项:单元->单元
它只是空方法,什么都不做。我不知道原因,但一切都在起作用。我想展示什么对我有用
首先,您必须在web.config
上启用CORS(如Mihai sad):
虽然这已经有了答案,但这是我的解决方案。
在web配置中,您必须删除
首先添加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团队发布了空方法之类的黑客攻击之后,就不再需要了。它正确地处理COR,包括飞行前请求。您可以在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>
我刚刚解决了在AJAX请求中删除xhr.setRequestHeader()
的相同问题。如果有人在代码中有一个,请尝试将其删除。适合我的解决方案:
将其添加到web.config(服务器端):
通常.Net会将错误信息与其405状态码一起发送。。。你收到了吗?我已经在Chrome中更新了我的问题并添加了此请求的屏幕。否,请参见你发布的更新图像,检查“预览”选项卡preview和Response选项卡是否为空,将WCF函数中的所有参数设置为可选。让我知道是什么原因导致我在ASP net web api 4中遇到同样的错误。怎么办请建议我得到它有时当一些dll文件损坏。你有没有办法测试服务器是否返回了一些东西?它发生在您所做的每个调用中,或者只是在某些情况下?简单的$.ajax调用可以正常工作,但是当从$http(angularjs模块)发出请求时,会出现此错误。。我在上面贴了一个问题:法拉盛对我有效(相应地提高了投票率),但我不明白为什么。我的JQuery Ajax调用在没有此功能的情况下可以正常工作,当在移动设备上但在VisualStudio中运行时,我从同一个JQuery调用中得到405。flush到底做什么?为什么我需要它?它起作用了,因为您的web.config中已经有CustomHeader返回COR期望的内容,但您没有允许选项的uriTemplate。因此,在您创建一个emtpy方法之后,preflight就可以工作了,它从customHeaders获得了例外的头。这是可行的,但我认为您可以将现有方法更改为method=“OPTIONS”,而不必重复它。它仍然会发布数据。非常感谢。这对我来说很有效,让我挠头很久了。请看我的帖子,我尝试了just Method=OPTIONS,这个failedIt是一个有效的解决方案,没有必要仅仅因为它看起来不好就否决它。
protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.Flush();
}
}
<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>
<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>
<?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>
<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>
protected void Application_BeginRequest(object sender, EventArgs e){
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.Flush();
}
}