针对预检的响应具有无效的HTTP状态代码405

问题描述:

我已经阅读了*中的许多类似问题,但该解决方案对我无效。针对预检的响应具有无效的HTTP状态代码405

我有WCF REST服务:

[<OperationContract>]  
    [<WebInvoke(UriTemplate = "PostItem", 
      RequestFormat= WebMessageFormat.Json, 
      ResponseFormat = WebMessageFormat.Json, Method = "POST")>]   

我可以用邮差(Chrome扩展)使用它。我将数据传递为“原始”,而不是“urlencoded”。我得到200个返回码。

enter image description here

我需要使用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

我已经寻找类似的问题,并发现两个解决方案:

  1. 使用jQuery设置标题Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',但它并没有与我的WCF服务
  2. 工作在我的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请求:

enter image description here

审查和Response选项卡是空

更新2:

一切工作正常,在IE ,但不起作用Chrome浏览器。

+0

通常.Net将发送错误信息及405状态码......你有没有收到? –

+0

我已更新我的问题,并在Chrome中添加此请求的屏幕。 – demas

+0

否,在您发布的更新图片中查看,选中“预览”标签 –

看起来像我找到解决方案。我刚刚添加第二种方法:

[<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 

这只是空白的方法,什么都不做。我不知道原因,但一切正常。

+0

它的工作原理是因为您的web.config中已经有customHeaders,它返回了COR期望的内容,但是您没有允许OPTIONS的uriTemplate。因此,在创建了一个emtpy方法之后,预检可以正常工作,并从customHeaders中获取了已排除的标题。 –

+0

在尝试了一个月的其他建议后,这个工作对我来说,开启和关闭,没有成功。 – quilkin

+0

这有效,但我认为你可以将现有方法更改为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(); 
    } 
} 
+1

我越来越同样的错误在ASP网络API api 4.做什么请建议 –

+0

我有时遇到了一些DLL文件损坏。你有办法测试服务器是否有退货吗?它发生在你所做的每一个电话中,还是仅仅在某些情况下? –

+1

简单的$ .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>