2016-03-28 7 views
17

पोस्ट करते समय मैंने पूरी तरह से खोज की है लेकिन मेरे विशेष परिस्थिति में इस समस्या का समाधान नहीं मिल रहा है।सीओआरएस सक्षम है लेकिन प्रीफ़लाइट के लिए प्रतिक्रिया में अवैध HTTP स्थिति कोड 404 है जब JSON

फिडलर (POST) का उपयोग कर क्रॉस-डोमेन सेवा कॉल सही ढंग से निष्पादित करते हैं और डेटा प्राप्त होता है। हालांकि, ब्राउजर (क्रोम) के माध्यम से मुझे संदेश मिल रहा है 'प्रीफलाइट में अमान्य HTTP स्टेटस कोड 404'

मेरे पास एक वेब एपीआई एप्लिकेशन है और मैंने सीओआरएस स्थापित किए हैं और यह सुनिश्चित किया है कि निम्नलिखित web.config फ़ाइल में मौजूद है:

var secretKey = 'difusod7899sdfiertwe08wepifdfsodifyosey', 
    url = 'http://api.intrinsic.co.uk/api/v1/PTS/ActiveDrivers?api_key=098werolllfWnCbPGAuIXVOJidDHRfYcgxImMlxTXopuekXrSOqOWzEAIdeNTWGPQPpyHxgVGsFysGFKPzq'; 

    jQuery.ajax ({ 
     url: url, 
     type: "POST", 
     data: JSON.stringify({ secretKey: secretKey}), 
     dataType: "json", 
     contentType: "application/json; charset=utf-8", 
     success: function(data){ 
      var content = "<table class=\"container\"><thead><tr><th>Driver Number</th><th>Timestamp</th><th>VRN</th><th>Latitude</th><th>Longitude</th><th>Track Link</th></tr></thead><tbody>"; 
      $.each(data.ActiveDrivers.DriverLocationStatus, function (index, element) { 
       content += "<tr><td>" + element.DriverNumber + "</td>"; 
       content += "<td>" + dateFormat(element.Timestamp, "d/m/yy") + " " + dateFormat(element.Timestamp, "h:MM TT") + "</td>"; 
       content += "<td>" + element.VRN + "</td>"; 
       content += "<td>" + element.CurrentLatitude + "</td>"; 
       content += "<td>" + element.CurrentLongitude + "</td>"; 
       content += "<td><a href=\"https://www.google.co.uk/maps/place//@" + element.CurrentLatitude + "," + element.CurrentLongitude + ",15z/\" target='_blank'>Track &raquo;</a></td></tr>"; 
      }); 
      content += "</tbody></table>"; 
      $("#result").html(content); 
     } 
    }); 

जाहिर है, के रूप में उल्लेख ही डोमेन पूरी तरह से काम करता है और, यह फ़िडलर का उपयोग कर काम करता है:

<system.webServer> 
    <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> 
    <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> 
</system.webServer> 

यहाँ अजाक्स कॉल है।

मुझे यकीन है कि यह ब्राउजर की प्रीफलाइट विकल्प जांच है जो सामग्री-प्रकार 'एप्लिकेशन/जेसन' के लिए असफल रहा है लेकिन मुझे यकीन नहीं है कि इसे कैसे ठीक किया जाए।

क्या web.config फ़ाइल में कुछ याद आ रही है जिसे मुझे जोड़ना चाहिए?

मैंने बिना किसी प्रभाव के 'सामग्री-प्रकार' को हटाने का प्रयास किया है।

मैं आशा व्यक्त की थी this article मुद्दा (यह होनहार लग रहा था), लेकिन एक ही त्रुटि का सामना कर रहा है का समाधान होगा:

XMLHttpRequest cannot load [URL]. Response for preflight has invalid HTTP status code 404 

उत्तर

14

मैं अंत में यह मिल गया काम करने के लिए।

इस लेख 'WebAPI with CORS – IIS Intercepts OPTIONS Verb' ने मेरी सोच को सूचित किया। एक छवि ने दिखाया कि, आईआईएस में, विकल्प हैंडलर मानचित्रण प्रकट हुए और क्यों, web.config के भीतर हमें यह सुनिश्चित करने के लिए निकालना था कि आईआईएस ने हस्तक्षेप नहीं किया था।

जब मैंने आईआईएस पर एक नज़र डाली कि हैंडलर वहां नहीं था। मैंने फिर लिंक किए गए आलेख 'Can't set HttpHandler order using Web.Config unless a «clear» tag exists' पर एक नज़र डाली और देखा कि, इस आलेख में, विकल्प हैंडलर को हटाने के बाद, इसे स्पष्ट रूप से web.config में जोड़ा गया था।

जैसा कि मैं आईआईएस में विकल्प हैंडलर नहीं देख सका, मैंने भी इसे web.config फ़ाइल में जोड़ा और अचानक अचानक काम किया। ऐसा प्रतीत होता है कि यह जोड़ आवश्यक था।

अंतिम वेब.कॉन्फिग हैंडलर अनुभाग निम्नानुसार दिखता है (नोटिस मैंने शुरुआती 'निकालने' का फैसला किया है, अगर भविष्य में किसी भिन्न वेब सर्वर पर माइग्रेट किया गया हो तो यह समस्याएं उत्पन्न हुईं)।

<system.webServer> 
    <handlers> 
     <remove name="WebDAV"/> 
     <remove name="OPTIONSVerbHandler"/> 
     <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> 
    <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, OPTIONS" /> 
     </customHeaders> 
    </httpProtocol> 
</system.webServer> 
+0

यह भी मेरे लिए काम करता .. –

+0

आप कृपया मुझे इस पर मदद कर सके काम करना चाहिए लगता है: https://magento.stackexchange.com/questions/170342/ magento-htaccess-response-for-preflight-has-invalid-http-status-code-400 –

+0

धन्यवाद काम किया। हैंडलर को भी जोड़ना महत्वपूर्ण है। – Dileep

34

धन्यवाद लेकिन ऊपर कॉन्फ़िगरेशन परिवर्तन के बाद 405 त्रुटि प्राप्त हो रही है।

अंत में यह जाल एपीआई में नीचे दिए गए कोड को जोड़ने के बाद Global.asax फ़ाइल

protected void Application_BeginRequest(Object sender, EventArgs e) 
    { 
     //HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
     if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
     { 
      HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache"); 
      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(); 
     } 
    } 
+1

यह अभी तक कोई जवाब क्यों नहीं है? – Immortal

2

मैं एक समान सेटअप है कि 404 त्रुटियों और 500 त्रुटियों दिखा रहा था के रूप में मैं CORS अपने वेब सेवा पर चल पाने के लिए प्रयास कर रहा था काम करता है । मेरा फिक्स मूल रूप से हुसैन के समाधान का उपयोग करता था, लेकिन जैसा कि मैंने अपना फिक्स साफ़ किया, मैंने ध्यान दिया कि केवल एक प्रतिक्रिया लाइन की आवश्यकता थी, और मैं मूल वेब हैंडलर को web.config में रखने में सक्षम था, और सभी को स्थानांतरित करने की आवश्यकता नहीं थी कोड में प्रतिक्रिया हैंडलर।

private void ApplicationOnBeginRequest(object sender, EventArgs eventArgs) 
     { 
... 
      if (context.Request.HttpMethod == "OPTIONS") 
       response.End(); 
     } 

और मेरे web.config में इन संचालकों:

मूल रूप से, मेरे ठीक मेरी ApplicationOnBeginRequest हैंडलर में इस एक प्रमुख सुधार शामिल

<system.webServer> 
    <!--Other handlers/modules ...--> 
    <httpProtocol> 
     <customHeaders> 
      <clear /> 
      <add name="Access-Control-Allow-Origin" value="*" /> 
      <add name="Access-Control-Allow-Credentials" value="true" /> 
      <add name="Access-Control-Allow-Headers" value="Content-Type,Accept" /> 
      <add name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS" /> 
     </customHeaders> 
    </httpProtocol> 
    </system.webServer> 

माफ करना, मैं नहीं इस भेज सकता है हुसैन के जवाब पर टिप्पणी के रूप में नोट करें।

9

यह मेरे लिए काम किया।

Global.asax

protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    //HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
    if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
    { 
     HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache"); 
     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(); 
    } 
} 

में web.config

में
<httpProtocol> 
     <customHeaders> 

    <add name="Access-Control-Allow-Origin" value="*"/> 
    <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS"/> 
    <add name="Access-Control-Allow-Headers" value="Content-Type"/> 
     </customHeaders> 
    </httpProtocol> 

पुनर्निर्माण और हे की सफ़ाई।

0

एएसपी कोर के लिए प्रक्रिया को कॉन्फ़िगर करने के लिए Startup.cs में इस कोड का उपयोग करें। मैं 2.0 संस्करण के लिए इस्तेमाल किया, लेकिन मैं इसके साथ बड़े भी

app.UseCors(builder => { 
       builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader(); 
      }); 
संबंधित मुद्दे