ASP.NET MVC / WebAPI एप्लिकेशन में HTTP विकल्प क्रिया का समर्थन कैसे करें


80

मैंने एक ASP.NET वेब अनुप्रयोग को MVC 4 / वेब एपीआई टेम्पलेट के साथ शुरू किया है। ऐसा लगता है जैसे कि चीजें वास्तव में अच्छी तरह से काम कर रही हैं - कोई समस्या नहीं जो मुझे पता है। साइट के माध्यम से जाने के लिए मैंने क्रोम और फ़ायरफ़ॉक्स का उपयोग किया है। मैंने फ़िडलर का उपयोग करके परीक्षण किया है और सभी प्रतिक्रियाएं पैसे पर लगती हैं।

तो अब मैं इस नए वेब एपीआई का उपभोग करने के लिए एक साधारण Test.aspx लिखने के लिए आगे बढ़ता हूं। स्क्रिप्ट के प्रासंगिक भाग:

<script type="text/javascript">
    $(function () {

        $.ajax({
            url: "http://mywebapidomain.com/api/user",
            type: "GET",
            contentType: "json",
            success: function (data) {

                $.each(data, function (index, item) {

                    ....

                    });
                }
                );

            },
            failure: function (result) {
                alert(result.d);
            },

            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert("An error occurred, please try again. " + textStatus);
            }

        });

    });
</script>

यह एक वास्तविक शीर्षक बनाता है:

OPTIONS http://host.mywebapidomain.com/api/user HTTP/1.1
Host: host.mywebapidomain.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://mywebapidomain.com
Access-Control-Request-Method: GET
Access-Control-Request-Headers: content-type
Connection: keep-alive

जैसा कि, वेब एपीआई एक 405 मेथड नॉट अलाउड रिटर्न करता है।

HTTP/1.1 405 Method Not Allowed
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/xml; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Sep 2013 13:28:12 GMT
Content-Length: 96

<Error><Message>The requested resource does not support http method 'OPTIONS'.</Message></Error>

मैं समझता हूं कि विकल्प क्रिया डिफ़ॉल्ट रूप से वेब एपीआई नियंत्रकों में वायर्ड नहीं होती है ... इसलिए, मैंने निम्नलिखित कोड अपने UserController.cs में रखा है:

// OPTIONS http-verb handler
public HttpResponseMessage OptionsUser()
{
    var response = new HttpResponseMessage();
    response.StatusCode = HttpStatusCode.OK;
    return response;
}

... और इसने 405 मेथड नॉट अलाइड एरर को खत्म कर दिया, लेकिन रिस्पॉन्स पूरी तरह से खाली है - कोई डेटा वापस नहीं किया गया:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Sep 2013 12:56:21 GMT
Content-Length: 0

अतिरिक्त तर्क होना चाहिए ... मुझे नहीं पता कि विकल्प विधि को ठीक से कैसे कोड किया जाए या यदि कोड को डालने के लिए नियंत्रक भी उचित स्थान है। अजीब (मेरे लिए) कि फ़ायरफ़ॉक्स या क्रोम से देखे जाने पर वेब एपीआई साइट ठीक से प्रतिक्रिया देती है, फिर भी .axax त्रुटियों के ऊपर कॉल करता है। मैं .ajax कोड में "प्रीफ़लाइट" चेक को कैसे संभाल सकता हूं? शायद मैं ग्राहक पक्ष पर इस मुद्दे को संबोधित कर रहा होना चाहिए। या, यदि यह विकल्प क्रिया को हैंडल नहीं करने के कारण सर्वर साइड पर कोई समस्या है।

क्या कोई मदद कर सकता है? यह एक बहुत ही सामान्य मुद्दा होना चाहिए और अगर इसका जवाब यहां दिया गया है तो मैं माफी चाहता हूं। मैंने खोज की लेकिन कोई जवाब नहीं मिला जिससे मदद मिली।

अद्यतन IMHO, यह एक ग्राहक पक्ष मुद्दा है और ऊपर Ajax JQuery कोड के साथ क्या करना है। मैं ऐसा इसलिए कहता हूं क्योंकि जब मैं वेब ब्राउज़र से mywebapidomain / api / user को एक्सेस करता हूं तो फ़िडलर कोई भी 405 त्रुटि हेडर नहीं दिखाता है। इस समस्या की नकल करने वाली एकमात्र जगह मैं JQuery .ajax () कॉल से ले सकता हूं। इसके अलावा, सर्वर (समान डोमेन) पर चलने पर समान Ajax कॉल ठीक काम करती है।

मुझे एक और पोस्ट मिली: प्रोटोटाइप AJAX अनुरोध GET के बजाय विकल्प के रूप में भेजा जा रहा है; 501 त्रुटि के परिणाम जो संबंधित प्रतीत होते हैं, लेकिन मैंने बिना किसी सफलता के उनके सुझावों के साथ छेड़छाड़ की है। जाहिरा तौर पर, JQuery को कोडित किया गया है ताकि अगर एक अजाक्स अनुरोध क्रॉस डोमेन (जो मेरा है) तो यह हेडर के एक जोड़े को जोड़ता है जो विकल्प हेडर को किसी भी तरह से ट्रिगर करता है।

'X-Requested-With': 'XMLHttpRequest',
'X-Prototype-Version': Prototype.Version,

बस ऐसा लगता है कि JQuery में कोर कोड को संशोधित करने से बेहतर समाधान उपलब्ध होना चाहिए ...

नीचे दिया गया उत्तर मानता है कि यह एक सर्वर साइड समस्या है। हो सकता है, मुझे लगता है, लेकिन मैं ग्राहक की ओर झुकता हूं और एक होस्टिंग प्रदाता को कॉल करने में मदद नहीं करता हूं।


आप अपने विकल्पों के अनुरोध के साथ क्या भेजने जा रहे हैं?
डैनियल ए। व्हाइट

मुझे ऑप्शन ऑप्शन भेजने की जरूरत नहीं है। किसी कारण से यह हो जाता है जब एक अजाक्स कॉल को क्रॉसडोमेन किया जाता है। इसलिए, जैसा कि आप जावास्क्रिप्ट में देख सकते हैं कि मैं जो कर रहा हूं वह सभी GET को निर्दिष्ट कर रहा है, फिर भी HTTP प्रोटोकॉल के कारण विकल्प शीर्ष लेख भेजा जाता है। यह एक "प्रीफ़्लाइट" चेक है।
rwkiii

2
ओह, आपको अपने आईस सर्वर पर कॉर्स को सक्षम करना चाहिए।
डैनियल ए। व्हाइट व्हाइट

यह एक Arvixe सर्वर है - बिजनेस क्लास प्रो। दोनों साइटों को एक ही भौतिक सर्वर, एक ही होस्टिंग खाते पर होस्ट किया जाता है। बस अलग-अलग मेजबान नाम। क्या कुछ ऐसा है जिसे मैं Arvixe कहे बिना सक्षम कर सकता हूं?
rwkiii

मैं आपके होस्टिंग प्रदाता को कॉल करूंगा।
डैनियल ए। व्हाइट व्हाइट

जवाबों:


52

जैसा कि डैनियल ए। व्हाइट ने अपनी टिप्पणी में कहा, विकल्प का अनुरोध ग्राहक द्वारा क्रॉस डोमेन जावास्क्रिप्ट अनुरोध के हिस्से के रूप में किया जाता है। यह स्वचालित रूप से क्रॉस ओरिजिनल रिसोर्स शेयरिंग (CORS) अनुरूप ब्राउज़रों द्वारा किया जाता है। अनुरोध एक प्रारंभिक या प्री-फ़्लाइट अनुरोध है, जो वास्तविक AJAX अनुरोध से पहले यह निर्धारित करने के लिए किया गया है कि कौन सी क्रियाएं और हेडर कॉर्स के लिए समर्थित हैं। सर्वर किसी भी, सभी या कुछ HTTP क्रियाओं के लिए इसका समर्थन करने का चुनाव कर सकता है।

तस्वीर को पूरा करने के लिए, AJAX अनुरोध में एक अतिरिक्त "उत्पत्ति" शीर्षलेख है, जिसने पहचान लिया कि मूल पृष्ठ जो जावास्क्रिप्ट की मेजबानी कर रहा है, वहां से सेवा की गई थी। सर्वर किसी भी मूल से अनुरोध का समर्थन करने के लिए, या सिर्फ ज्ञात, विश्वसनीय मूल के एक सेट के लिए चुनाव कर सकता है। किसी भी उत्पत्ति की अनुमति देना एक सुरक्षा जोखिम है क्योंकि इससे क्रॉस साइट रिक्वेस्ट फॉरगेरी (सीएसआरएफ) का जोखिम बढ़ सकता है।

इसलिए, आपको CORS को सक्षम करने की आवश्यकता है।

यहां एक लिंक दिया गया है जो बताता है कि ASP.Net वेब एपीआई में यह कैसे करना है

http://www.asp.net/web-api/overview/security/en enable-cross-origin-requests-in-web-api#enable-cors

वहां वर्णित कार्यान्वयन आपको अन्य चीजों के बीच निर्दिष्ट करने की अनुमति देता है

  • प्रति-एक्शन, प्रति-नियंत्रक या वैश्विक आधार पर कोर समर्थन करता है
  • समर्थित मूल
  • जब कोर्स आ नियंत्रक या वैश्विक स्तर को सक्षम करता है, तो समर्थित HTTP क्रियाएं
  • क्या सर्वर क्रॉस-ऑरिजिनल रिक्वेस्ट के साथ क्रेडेंशियल्स भेजने का समर्थन करता है

सामान्य तौर पर, यह ठीक काम करता है, लेकिन आपको यह सुनिश्चित करने की आवश्यकता है कि आप सुरक्षा जोखिमों से अवगत हैं, खासकर यदि आप किसी भी डोमेन से क्रॉस मूल अनुरोधों की अनुमति देते हैं। इसे अनुमति देने से पहले बहुत सावधानी से सोचें।

किन ब्राउज़र ब्राउज़रों का समर्थन करते हैं, विकिपीडिया का कहना है कि निम्नलिखित इंजन इसका समर्थन करते हैं:

  • गेको 1.9.1 (फ़ायरफ़ॉक्स 3.5)
  • WebKit (Safari 4, Chrome 3)
  • IE8 और 9 में आंशिक समर्थन के साथ MSHTML / ट्राइडेंट 6 (IE10)
  • प्रेस्टो (ओपेरा 12)

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing#Browser_support


हाय माइक। लिंक के लिए धन्यवाद, यहाँ एक और भी अच्छा है: codeguru.com/csharp/.net/net_asp/… - हालांकि इनमें से किसी ने भी मेरे लिए समस्या तय नहीं की है, फिर भी। मैंने अपने परीक्षण पृष्ठ अभी के लिए सर्वर पर रख दिए हैं और यह मुझे अल्पावधि के लिए मदद करता है। मैंने Microsoft.AspNet.WebApi.Cors स्थापित करने की कोशिश की, लेकिन एक अजीब त्रुटि मिली कि मेरे ऐप में कोई WebApi निर्भरता नहीं थी और इसलिए वापस लुढ़का। आपके उत्तर के लिए धन्यवाद - मुझे पता है कि यह सही है। +1!
rwkiii 16

@rwkiii लिंक वास्तव में एक समाधान है जिसमें वेब API 5.2.2 पर निर्भरता जोड़ना शामिल है, लेकिन विकल्प MVC को विकल्प पूर्व-उड़ान अनुरोध का समर्थन करने के लिए मजबूर करने के लिए समाधान हैक की तुलना में अधिक एक्स्टेंसिबल होगा। आप डोमिनिक के उत्तर की समीक्षा भी कर सकते हैं क्योंकि प्री-फ़्लाइट अनुरोध स्वीकार या सामग्री-प्रकार हेडर का परिणाम हो सकता है जिसके लिए क्लाइंट से ऐसी कॉल की आवश्यकता होती है
सुधांशु मिश्रा

केवल एक नोट लेकिन अगर आप सामग्री-प्रकार को इस पर सेट करते हैं: 'एप्लिकेशन / x-www-form-urlencoded', 'मल्टीपार्ट / फॉर्म-डेटा' या 'टेक्स्ट / प्लेन' तो अनुरोध को 'सरल' और अभ्यस्त मुद्दा नहीं माना जाता है। उड़ान पूर्व अनुरोध।
mbx-mbx

94

माइक गुडविन का जवाब बहुत अच्छा है लेकिन ऐसा लगता है, जब मैंने कोशिश की, कि इसका उद्देश्य MVC5 / WebApi 2.1 था। Microsoft.AspNet.WebApi.Cors के लिए निर्भरता मेरे MVC4 प्रोजेक्ट के साथ अच्छी तरह से नहीं खेली।

MVC4 के साथ WebApi पर CORS को सक्षम करने का सबसे सरल तरीका निम्नलिखित था।

ध्यान दें कि मैंने सभी की अनुमति दी है, मेरा सुझाव है कि आप ओरिजिन की सीमा केवल उन ग्राहकों तक सीमित रखें जिन्हें आप चाहते हैं कि आपका एपीआई सेवा करे। सबकुछ आवंटित करना एक सुरक्षा जोखिम है।

Web.config:

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, HEAD" />
        <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
      </customHeaders>
    </httpProtocol>
</system.webServer>

BaseApiController.cs:

हम विकल्प http क्रिया को अनुमति देने के लिए ऐसा करते हैं

 public class BaseApiController : ApiController
  {
    public HttpResponseMessage Options()
    {
      return new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
    }
  }

@ कस्तलदी यह संभव है क्योंकि प्रदान किया गया उत्तर वेबएपी 1 पर लक्षित था जिसमें विशेषता रूटिंग नहीं थी। WebApi 2 के लिए मैं Microsoft के CorS nuget पैकेज का उपयोग करने का सुझाव दूंगा। nuget.org/packages/Microsoft.AspNet.WebApi.Cors
ओलिवर

आप स्वैगर पर विकल्प के समापन बिंदु को अनदेखा करने के लिए [ApiExplorerSettings (IgnoreApi = true)] का भी उपयोग कर सकते हैं।
मेरियो मेयरेलस

यह मेरे WebApi 2 ऐप के लिए काम करता है। विशेष रूप से विकल्प () विधि प्रासंगिक / आधार नियंत्रक के लिए
आलसीवादी

24

बस इसे अपनी Application_OnBeginRequestविधि में जोड़ें (यह आपके आवेदन के लिए विश्व स्तर पर कॉर्स का समर्थन करने में सक्षम होगा) और "प्रीफ़लाइट अनुरोधों को संभालें":

var res = HttpContext.Current.Response;
var req = HttpContext.Current.Request;
res.AppendHeader("Access-Control-Allow-Origin", req.Headers["Origin"]);
res.AppendHeader("Access-Control-Allow-Credentials", "true");
res.AppendHeader("Access-Control-Allow-Headers", "Content-Type, X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Date, X-Api-Version, X-File-Name");
res.AppendHeader("Access-Control-Allow-Methods", "POST,GET,PUT,PATCH,DELETE,OPTIONS");

// ==== Respond to the OPTIONS verb =====
if (req.HttpMethod == "OPTIONS")
{
    res.StatusCode = 200;
    res.End();
}

* सुरक्षा: ध्यान रखें कि यह आपके सर्वर के लिए कहीं से भी ajax अनुरोधों को सक्षम करेगा (आप इसके बजाय केवल यदि आप चाहें तो Origins / urls की अल्पविराम से अलग सूची की अनुमति दे सकते हैं)।

मैंने इसके बजाय वर्तमान क्लाइंट उत्पत्ति का उपयोग किया *क्योंकि इससे क्रेडेंशियल्स => Access-Control-Allow-Credentialsसही होने की अनुमति होगी, क्रॉस ब्राउज़र सत्र प्रबंधन को सक्षम करेगा

आपको अपने webconfigअनुभाग में हटाने और डालने, पैच और विकल्प क्रियाओं को सक्षम करने की आवश्यकता है system.webServer, अन्यथा IIS उन्हें ब्लॉक करेगा:

<handlers>
  <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" />
</handlers>

उम्मीद है की यह मदद करेगा


3
धन्यवाद। केवल Application_OnBeginRequestइससे मुझे मदद मिली। लेकिन अगर आप भी प्राधिकरण के साथ डेटा प्राप्त करने में सक्षम होना चाहता हूँ, आप भी जोड़ना चाहिए Authorizationकरने के लिएAccess-Control-Allow-Headers
Ehsan88

18

एक वेब एपीआई 2 परियोजना में एक ही मुद्दे का सामना करने के बाद (और यहां जाने के लायक नहीं होने के कारणों के लिए मानक कॉर्स पैकेज का उपयोग करने में असमर्थ होने के कारण), मैं एक कस्टम डेलगेटिंगहैंडलर को लागू करके इसे हल करने में सक्षम था:

public class AllowOptionsHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var response = await base.SendAsync(request, cancellationToken);

        if (request.Method == HttpMethod.Options &&
            response.StatusCode == HttpStatusCode.MethodNotAllowed)
        {
            response = new HttpResponseMessage(HttpStatusCode.OK);
        }

        return response;
    }
}

वेब API कॉन्फ़िगरेशन के लिए:

config.MessageHandlers.Add(new AllowOptionsHandler());

ध्यान दें कि मेरे पास Web.config में सक्षम कोर हेडर भी हैं, यहाँ पोस्ट किए गए कुछ अन्य उत्तरों के समान:

<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="accept, cache-control, content-type, authorization" />
      <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
  </httpProtocol>

  <handlers>
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <remove name="TRACEVerbHandler" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
</system.webServer>

ध्यान दें कि मेरी परियोजना में MVC, केवल वेब API 2 शामिल नहीं है।


10

मैं 405 और 404 त्रुटियों को दूर करने में कामयाब रहा हूं, जो वैश्विक उड़ान में कस्टम कोड द्वारा पूर्व-उड़ान अजाक्स विकल्प अनुरोधों पर डाली गई हैं।

protected void Application_BeginRequest()
    {            
        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, OPTIONS");
            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 में इसकी आवश्यकता है:

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

और app.pool को एकीकृत मोड में सेट करने की आवश्यकता है।


8

मुझे भी बिल्कुल यही समस्या है। मेरे लिए फिक्स jQuery AJAX कॉल से कस्टम सामग्री प्रकार को हटाने के लिए था। कस्टम सामग्री प्रकार पूर्व-उड़ान अनुरोध को ट्रिगर करते हैं। मुझे मिला:

यदि निम्न स्थितियाँ सत्य हैं, तो ब्राउज़र प्रीफ़लाइट अनुरोध को छोड़ सकता है:

अनुरोध विधि है GET, HEADया POST, और

आवेदन किसी भी अनुरोध हेडर के अलावा अन्य निर्धारित नहीं करता है Accept, Accept-Language, Content-Language, Content-Type, या Last-Event-ID, और

Content-Typeहैडर (यदि सेट) निम्न में से एक है:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

इस पृष्ठ से: http://www.asp.net/web-api/overview/security/en enable-cross-origin-requests-in-web-api ("प्रीफ़लाइट अनुरोध" के तहत)



2
    protected void Application_EndRequest()
    {
        if (Context.Response.StatusCode == 405 && Context.Request.HttpMethod == "OPTIONS" )
        {
            Response.Clear();
            Response.StatusCode = 200;
            Response.End();
        }
    }

1

मैंने भी उसी मुद्दे का सामना किया।

ब्राउज़रों में (CORS) अनुपालन पर समस्या को हल करने के लिए नीचे दिए गए चरण का पालन करें।

कॉर्क संदर्भ के साथ अपने समाधान में REDRock शामिल करें। WebActivatorEx वेब एपीआई समाधान के संदर्भ में शामिल करें।

फिर वेब API App_Start फ़ोल्डर में CorsConfig फ़ाइल जोड़ें।

[assembly: PreApplicationStartMethod(typeof(WebApiNamespace.CorsConfig), "PreStart")]

namespace WebApiNamespace
{
    public static class CorsConfig
    {
        public static void PreStart()
        {
            GlobalConfiguration.Configuration.MessageHandlers.Add(new RedRocket.WebApi.Cors.CorsHandler());
        }
    }
}

किए गए इन परिवर्तनों के साथ मैं सभी ब्राउज़रों में वेबपी को एक्सेस करने में सक्षम था।


4
Redrock क्या है? मैंने एक Google खोज और एक Nuget पैकेज खोज की और कुछ भी नहीं लौटाया। एक लिंक अच्छा होगा।
hofnarwillie

1

मेरे पास एक ही समस्या है, और यह है कि मैंने इसे कैसे तय किया:

बस इसे अपने web.config में फेंक दें:

<system.webServer>
    <modules>
      <remove name="WebDAVModule" />
    </modules>

    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Expose-Headers " value="WWW-Authenticate"/>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, PATCH, DELETE" />
        <add name="Access-Control-Allow-Headers" value="accept, authorization, Content-Type" />
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>

    <handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

0
//In the Application_OnBeginRequest method in GLOBAL.ASX add the following:-  

var res = HttpContext.Current.Response;  
var req = HttpContext.Current.Request;  
res.AppendHeader("Access-Control-Allow-Origin", "*");  
res.AppendHeader("Access-Control-Allow-Credentials", "true");  
res.AppendHeader("Access-Control-Allow-Headers", "Authorization");  
res.AppendHeader("Access-Control-Allow-Methods", "POST,GET,PUT,PATCH,DELETE,OPTIONS");  

    // ==== Respond to the OPTIONS verb =====
    if (req.HttpMethod == "OPTIONS")
    {
        res.StatusCode = 200;
        res.End();
    }

//Remove any entries in the custom headers as this will throw an error that there's to  
//many values in the header.  

<httpProtocol>
    <customHeaders>
    </customHeaders>
</httpProtocol>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.