Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 飞行前的响应具有无效的HTTP状态代码405_Javascript_Angularjs_Wcf_Rest - Fatal编程技术网

Javascript 飞行前的响应具有无效的HTTP状态代码405

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"

我在StackOverflow中读到了许多类似的问题,但解决方案对我来说并不适用

我有WCF休息服务:

[<OperationContract>]    
    [<WebInvoke(UriTemplate = "PostItem", 
            RequestFormat= WebMessageFormat.Json,   
            ResponseFormat = WebMessageFormat.Json, Method = "POST")>]         
我刚刚从邮递员那里复制了URL和JSON。但我得到了一个错误:

js:10722选项 . 回应 飞行前的HTTP状态代码405无效

我搜索了类似的问题,找到了两种解决方案:

  • 使用jQuery设置标题
    内容类型“:”application/x-www-form-urlencoded;charset=UTF-8'
    ,但它不适用于我的WCF服务
  • 在my 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>
    
    
    

    “审阅”和“响应”选项卡为空

    更新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();
                }
        }