简体   繁体   中英

Preflight has invalid HTTP status code 404 Jquery AJAX POST

Alright I really hate it when it has this error in the console. And I know that stackoverflow is flooded with these types of questions. However, I've done the research and I have CORS enabled in my Web API 2 web service and I'm still getting this error.

This is my Web API 2 code:

namespace WebApi.App.Controllers
{
    [EnableCors(origins: "*", headers: "*", methods: "*")]
    public class ServiceController : ApiController
    {
        [HttpGet]
        [Route("GetData")]
        public IHttpActionResult GetEmpData(DATAvars theDATA)
        {
            return Ok("WORKED! " + theDATA);            
        }

        [HttpPost]
        [Route("PostData")]
        public IHttpActionResult PostEmpData(DATAvars theDATA)
        {
            return Ok("WORKED! " + theDATA.theID);
        }

    }

    public class DATAvars
    {
        public string theID { get; set; }
        public string empImg { get; set; }
    }
}

AND

<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
</modules>
<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>
<handlers>
  <remove name="WebDAV" />
  <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>

AND

namespace WebApi.App
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Formatters.Clear();
            config.Formatters.Add(new JsonMediaTypeFormatter());
            config.MapHttpAttributeRoutes();
            config.EnableCors();
        }
    }
}

AND

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin" , "*");

    if (HttpContext.Current.Request.HttpMethod == "OPTIONS" )
    { 
        //These headers are handling the "pre-flight" OPTIONS call sent by the browser
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods" , "GET, POST" );
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers" , "Content-Type, Accept" );
        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
        HttpContext.Current.Response.End();
    } 
    } 
}

Then for my AJAX call code (which is being hosted on another domain):

$.ajax({
    type: "POST",
    crossDomain: true,
    url: "http://dev-blahblah/newWS/PostData",
    beforeSend: function (xhrObj) {
        xhrObj.setRequestHeader("Content-Type", "application/json");
    },
    data: {
        theID: "2135648792",
        empImg: "false"
    },
    dataType: "json",
    success: function (data) {
        console.log(data);
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        console.log(XMLHttpRequest);
    }
});

And this is the error in the console: 在此处输入图像描述

The Console Network says: 在此处输入图像描述

Failed to load resource: the server responded with a status of 404 (Not Found) index.html:1 XMLHttpRequest cannot load http://dev-blahblah/newWS/PostData . Response for preflight has invalid HTTP status code 404

And now this is the SAME request but in POSTMAN :

I've spent DAYS trying to figure this out and endless googleing to find examples, I have, but seems like all the examples do not work.

I would be very grateful for someone to let me know what I need to do in order to get this working with JQUERY AJAX.

-Running it on the same domain in CHROME = WORKS

-Running it on a different domain in CHROME = DOES NOT WORK

-Running it on the same domain in IE = WORKS

-Running it on a different domain in IE = WORKS

Used the following config section in my web API web.config file to avoid the 404 error.

<handlers>
  <remove name="WebDAV"/>
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="ProtocolSupportModule" requireAccess="None" responseBufferLimit="4194304" />
</handlers>

Removing WebDAV did not work for me as there might be a global policy on my server. This, however, cut it:

<system.webServer>
    <security>
        <requestFiltering>
            <verbs applyToWebDAV="false">
                <add verb="DELETE" allowed="true" />
                <add verb="PUT" allowed="true" />
                <add verb="OPTIONS" allowed="true" />
            </verbs>
        </requestFiltering>
    </security>
</system.webServer>

It was <add verb="OPTIONS" allowed="true" /> that made the difference.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM