এমভিসি ওয়েব এপিআই: অনুরোধকৃত উত্সটিতে কোনও 'অ্যাক্সেস-কন্ট্রোল-অলজন-অরিজিন' শিরোনাম উপস্থিত নেই


128

এই নিবন্ধে যা লেখা আছে তা আমি চেষ্টা করেছি: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api , কিন্তু কিছুই কার্যকর হয় না। আমি কৌণিক জেএস ব্যবহার করে অন্য ডোমেনে ব্যবহার করতে ওয়েবএপিআই 2 (এমভিসি 5) থেকে ডেটা পাওয়ার চেষ্টা করছি।

আমার নিয়ামকটি দেখতে এমন দেখাচ্ছে:

namespace tapuzWebAPI.Controllers
{
    [EnableCors(origins: "http://local.tapuz.co.il", headers: "*", methods: "*", SupportsCredentials = true)]
    [RoutePrefix("api/homepage")]
    public class HomePageController : ApiController
    {
        [HttpGet]
        [Route("GetMainItems")]
        //[ResponseType(typeof(Product))]
        public List<usp_MobileSelectTopSecondaryItemsByCategoryResult> GetMainItems()
        {


            HomePageDALcs dal = new HomePageDALcs();
            //Three product added to display the data

            //HomePagePromotedItems.Value.Add(new HomePagePromotedItem.Value.FirstOrDefault((p) => p.ID == id));


            List<usp_MobileSelectTopSecondaryItemsByCategoryResult> items = dal.MobileSelectTopSecondaryItemsByCategory(3, 5);
            return items;

        }      
    }
}

1
কর অনুরোধের জন্য আপনার কৌনিক
কোডটিও

2
তার কৌনিক কোডটি নিয়ে সম্ভবত কোনও সমস্যা নেই কারণ বেশিরভাগ সিওআরএস প্রোব্লামগুলি কেবল সার্ভার কনফিগারেশনের কারণে
sam

আমার একই ধরণের সেটআপ রয়েছে, আমি লক্ষ্য করেছি যে আমি যখন এপিআই-তে কোনও অ-বিদ্যমান ক্রিয়াকলাপের জন্য অনুরোধ করি এবং ওয়েবএপি একটি 404 ফিরিয়ে দিচ্ছে, তখন সিওআরএস শিরোনাম অনুপস্থিত এবং ব্রাউজারটি অভিযোগ করবে। সুতরাং, সম্ভবত এটি হিসাবে সহজ।
রবিন ভ্যান ডার Knaap

উত্তর:


295

আপনাকে আপনার ওয়েব এপিআই-তে CORS সক্ষম করতে হবে । বিশ্বব্যাপী CORS সক্ষম করার সহজ ও পছন্দের উপায় হ'ল নিম্নলিখিত বিষয়গুলি ওয়েবকনফাইগের সাথে যুক্ত করা

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

দয়া করে নোট করুন যে পদ্ধতিগুলি সমস্ত ব্যবহারের পরিবর্তে স্বতন্ত্রভাবে নির্দিষ্ট করা আছে *। কারণ এটি ব্যবহার করার সময় একটি ত্রুটি ঘটছে *

আপনি কোড দ্বারা সিওআরএস সক্ষম করতে পারেন ।

আপডেট করুন
নিম্নলিখিত NuGet প্যাকেজ প্রয়োজন বোধ করা হয়: Microsoft.AspNet.WebApi.Cors

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.EnableCors();

        // ...
    }
}

তারপরে আপনি [EnableCors]এই জাতীয় পদক্ষেপ বা নিয়ন্ত্রণকারীগুলিতে বৈশিষ্ট্যটি ব্যবহার করতে পারেন

[EnableCors(origins: "http://www.example.com", headers: "*", methods: "*")]

অথবা আপনি বিশ্বব্যাপী এটি নিবন্ধন করতে পারেন

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute("http://www.example.com", "*", "*");
        config.EnableCors(cors);

        // ...
    }
}

Options অনুরোধগুলি সহ আপনাকে প্রিফলাইট অনুরোধগুলিও পরিচালনা করতে হবে HTTP OPTIONS

Web APIOptionsএটি সত্যই সমর্থন করার জন্য কনফিগার করা হয়েছে তা নিশ্চিত করার জন্য অনুরোধটির প্রতিক্রিয়া জানাতে হবে CORS

এটি পরিচালনা করতে, আপনাকে খালি প্রতিক্রিয়া ফিরিয়ে পাঠাতে হবে back আপনি নিজের ক্রিয়াকলাপের ভিতরে এটি করতে পারেন, বা আপনি এটি বিশ্বব্যাপী এটি করতে পারেন:

# Global.asax.cs
protected void Application_BeginRequest()
{
    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
    {
        Response.Flush();
    }
}

APIsকেবলমাত্র গ্রহণের জন্য তৈরি করা হয়েছে GETএবং POSTঅনুরোধগুলি কাজে লাগানো হবে না তা নিশ্চিত করতে এই অতিরিক্ত চেক যুক্ত করা হয়েছিল added যখন এই ক্রিয়াটি উপস্থিত ছিল না তখন DELETEকোনও APIডিজাইনে একটি অনুরোধ প্রেরণ করার কল্পনা করুন । ফলাফল অনির্দেশ্য এবং ফলাফল বিপজ্জনক হতে পারে ।


3
আপনার উত্তর আমাকে সাহায্য করেছে। কোড বেইজ সলিউশন দিয়ে আমি যা কিছু পারলাম চেষ্টা করেছিলাম। আমি আপনার উত্তরটি না পড়া পর্যন্ত আমি ওয়েবকনফিগ বিকল্পটি চেষ্টা করিনি। এটি একমাত্র কাজ করেছিল। কোন ধারণা কেন? আমি ওডিটা সহ ওয়েব এপিআই 2 ব্যবহার করছি। যাই হোক ধন্যবাদ! :)
ফিলিপ কোরিয়া

1
ভবিষ্যতের রেফারেন্সের জন্য আপনার নুগেট প্যাকেজটির দরকার এটি হ'ল "মাইক্রোসফ্ট.এএসপনেট.উইবএপিআই.কর্স"।
BrainSlugs83

2
আমি আপনার সমস্ত উত্তর অনুসরণ করেছি এবং আমার দুটি প্রশ্ন রয়েছে: অ্যাপ্লিকেশন_বেগিনআরয়েস্ট () কোথায় নেওয়া উচিত? এবং দ্বিতীয়ত, একই পদ্ধতিতে। কনটেনস ("উত্স") আমাকে সত্যিই সংকলন করে না, স্ট্রিং.কন্টেনস বা লিনক। কনটেনস থেকে কোথা থেকে এই পদ্ধতিটি এসেছে?
meJustAndrew

2
মনে রাখবেন একটি ভিন্ন পোর্ট # একটি আলাদা ডোমেন গঠন করে, যা গোটচা হতে পারে। foo.com foo.com:8080 -র চেয়ে আলাদা ডোমেন
রাইবোল্ট

1
আপনি আমার জীবন বাঁচান;)
পাওয়ে গ্রোস্কি

26

@ মিহাই-আন্দ্রেই ডিনকুলেসকের উত্তর সঠিক, তবে অনুসন্ধানকারীদের সুবিধার্থে একটি সূক্ষ্ম বিন্দুও রয়েছে যা এই ত্রুটির কারণ হতে পারে।

আপনার ইউআরএল শেষে একটি '/' যুক্ত করা সক্ষমকরণগুলি সমস্ত পরিস্থিতিতে কাজ করা বন্ধ করবে (যেমন হোমপেজ থেকে)।

অর্থাৎ এটি কাজ করবে না

var cors = new EnableCorsAttribute("http://testing.azurewebsites.net/", "*", "*");
config.EnableCors(cors);

তবে এটি কাজ করবে:

var cors = new EnableCorsAttribute("http://testing.azurewebsites.net", "*", "*");
config.EnableCors(cors);

এ্যাবলিগেটরস অ্যাট্রিবিউট ব্যবহার করা হলে প্রভাবটি একই হয়।


ধন্যবাদ !! এটা সহায়ক ছিল।
অঙ্কিত সাহরাওয়াত

23

আমি মিহাই-আন্দ্রেই ডিনকুলেসু দ্বারা নির্দেশিত উপরের সমস্ত পদক্ষেপগুলি অনুসরণ করেছি
তবে আমার ক্ষেত্রে, আমার আরও 1 টি পদক্ষেপের প্রয়োজন ছিল কারণ নীচের লাইনের মাধ্যমে HT অপশনগুলি ওয়েব.কনফাইজে অক্ষম করা হয়েছিল।

<remove name="OPTIONSVerbHandler" />

আমি কেবল এটি ওয়েব.কনফিগ থেকে সরিয়েছি (কেবল নীচের মত এটি মন্তব্য করুন) এবং কর্স একটি আকর্ষণ হিসাবে কাজ করে

<handlers>
  <!-- remove name="OPTIONSVerbHandler" / -->
</handlers>

9

এটি কর্স প্যাকেজ প্যাকেজ ইনস্টল করার কারণে হতে পারে।

নুগেট থেকে করগুলি ইনস্টল ও সক্ষম করার পরে যদি আপনি সমস্যার মুখোমুখি হন তবে আপনি ওয়েব এপিই পুনরায় ইনস্টল করার চেষ্টা করতে পারেন।

প্যাকেজ ম্যানেজার থেকে, চালান Update-Package Microsoft.AspNet.WebApi -reinstall


এটা ঠিক আমার জন্য ছিল। আমি System.Web.Http.Cors ইনস্টল করেছি এবং তারপরে আনইনস্টল করেছি, যা WebApi টি 5.2.2 এবং 5.2.3 এর মধ্যে ভুল (নতুন আপগ্রেড করা) সংস্করণে রেখে গেছে
টেকউনজয়ে

7

আপনি CORS সঠিকভাবে কনফিগার করেছেন তা নিশ্চিত করার জন্য এটি ব্যবহার করে দেখুন:

[EnableCors(origins: "*", headers: "*", methods: "*")]

এখনও কাজ করছে না? HTTP শিরোনাম উপস্থিতি পরীক্ষা করুন।


এটির কার্যকারিতা, সমর্থন
প্রত্যয়গুলি

সর্বোত্তম উত্তর কারণ আমি আমার সম্পূর্ণ সাইটের জন্য কেবলমাত্র নির্দিষ্ট প্রান্তগুলিকে CORS সক্ষম করতে চাই না। config.EnableCors()পাশাপাশি এটি প্রয়োজন।
সিএসবা তোথ

4

যে কোনও সিওআরএস প্রোটোকলকে কাজ করতে, আপনার প্রতিটি শেষ পয়েন্টে (বা এই পদ্ধতির সাথে একটি গ্লোবাল ফিল্টার) একটি অপশন পদ্ধতি থাকা দরকার যা সেই শিরোনামগুলি ফিরিয়ে দেবে:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: content-type

কারণটি হ'ল ব্রাউজারটি প্রথমে আপনার সার্ভারের 'পরীক্ষা' করতে অনুমোদনের অনুরোধ পাঠাবে এবং অনুমোদনগুলি দেখবে


2

আমি কর্স সম্পর্কে পরবর্তী মামলা ধরুন। হতে পারে এটি কারও কাজে লাগবে। আপনি যদি আপনার সার্ভারে 'ওয়েবডাভ পুনর্নির্দেশক' বৈশিষ্ট্যটি যুক্ত করেন তবে পুট এবং ডিলিট অনুরোধগুলি ব্যর্থ হয়।

সুতরাং, আপনাকে আপনার আইআইএস সার্ভার থেকে 'ওয়েবডিএভিএমডিউল' অপসারণ করতে হবে:

  • "আইআইএস মডিউলগুলির কনফিগারেশনে, ওয়েব ডিভিএভিমোডিয়াল লুপ আপ করুন, যদি আপনার ওয়েব সার্ভারটি থাকে, তবে এটি সরান"।

বা আপনার কনফিগারেশনে যুক্ত করুন:

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


2

আমি জানি আমি খুব দেরীতে এসেছি। যাইহোক, যিনি অনুসন্ধান করছেন তার জন্য, আমি ভেবেছিলাম যে আমার জন্য শেষ পর্যন্ত কী কাজ করেছে তা প্রকাশ করব। আমি দাবি করছি না এটির সেরা সমাধান - কেবল এটিই কাজ করেছিল।

আমাদের ওয়েবএপি পরিষেবা কনফিগারেশন (সক্ষম) (কর্সঅ্যাট্রিবিউট) পদ্ধতি ব্যবহার করে। যাইহোক, এটির সাথে, এটি পূর্ব-বিমানের অনুরোধগুলিতে ব্যর্থ হবে। @ মিহাই-আন্দ্রেই ডিনকুলেসকের উত্তরটি আমার কাছে ক্লু সরবরাহ করেছিল। প্রথমত, আমি বিকল্পগুলির অনুরোধগুলি ফ্লাশ করতে তার অ্যাপ্লিকেশন_বেগিনআরকেস্ট () কোড যুক্ত করেছি। এটি এখনও আমার পক্ষে কাজ করে না। সমস্যাটি হ'ল ওয়েবএপিআই এখনও অপশনগুলির অনুরোধে প্রত্যাশিত শিরোনামগুলির কোনও যোগ করে নি। এটি একা ফ্লাশ করা কাজ করেনি - তবে এটি আমাকে ধারণা দিয়েছে। আমি কাস্টম শিরোনাম যুক্ত করেছি যা অন্যথায় অপশন অনুরোধের প্রতিক্রিয়ায় ওয়েবকনফিগের মাধ্যমে যুক্ত করা হবে। আমার কোডটি এখানে:

protected void Application_BeginRequest()
{
  if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
  {
    Response.Headers.Add("Access-Control-Allow-Origin", "https://localhost:44343");
    Response.Headers.Add("Access-Control-Allow-Headers",
      "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
    Response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    Response.Headers.Add("Access-Control-Allow-Credentials", "true");
    Response.Flush();
  }
}

স্পষ্টতই, এটি কেবল বিকল্পগুলির অনুরোধগুলিতে প্রযোজ্য। অন্যান্য সমস্ত ক্রিয়াগুলি CORS কনফিগারেশন দ্বারা পরিচালিত হয়। যদি এর থেকে আরও ভাল পন্থা থাকে তবে আমি সমস্ত কান। এটি আমার কাছে প্রতারণার মতো মনে হয় এবং শিরোনামগুলি স্বয়ংক্রিয়ভাবে যুক্ত হয়ে থাকলে আমি পছন্দ করব তবে অবশেষে এটিই কাজ করেছে এবং আমাকে এগিয়ে যাওয়ার অনুমতি দিয়েছে।


1

@ মিহাই-আন্দ্রেই ডিনকুলেসকের উত্তর আমার পক্ষে কাজ করেছে, যেমন:

  • <httpProtocol>ওয়েবকনফিগের <system.webServer>বিভাগে একটি যুক্ত করা হচ্ছে
  • ফাঁকা প্রতিক্রিয়া রিটার্নিং OPTIONSউল্লিখিত মাধ্যমে অনুরোধ Application_BeginRequest()মধ্যেglobal.asax

ব্যতীত তার চেকটি Request.Headers.AllKeys.Contains("Origin")আমার পক্ষে কাজ করে না, কারণ অনুরোধটিতে একটি রয়েছে origing, তাই লোয়ারকেস সহ। আমি মনে করি আমার ব্রাউজারটি (ক্রোম) এটির জন্য অনুরোধের জন্য এটি পাঠায়।

পরিবর্তে তার চেকের ক্ষেত্রে সংবেদনশীল বৈকল্পিকটি ব্যবহার করে আমি এটি আরও খানিকটা সমাধান করেছি Contains: if (culture.CompareInfo.IndexOf(string.Join(",", Request.Headers.AllKeys), "Origin", CompareOptions.IgnoreCase) >= 0) {


0

আপনার সুরক্ষা থাকলে \ অনুরোধ ফিল্টারিং নোডগুলি আপনার ওয়েবকনফাইগের নীচে হিসাবে:

<security>
  <requestFiltering>
    <verbs allowUnlisted="false">
      <add verb="GET" allowed="true" />
      <add verb="POST" allowed="true" />
      <add verb="PUT" allowed="true" />
      <add verb="DELETE" allowed="true" />
      <add verb="DEBUG" allowed="true" />          
    </verbs>
  </requestFiltering>

আপনি এটি যোগ করেছেন তা নিশ্চিত করুন

<add verb="OPTIONS" allowed="true" />

0

এই উত্তরে প্রদত্ত পদ্ধতিগুলি সহ নেটটিতে আমি যা খুশি তার সবই চেষ্টা করেছিলাম। প্রায় পুরো দিন সমস্যাটি সমাধান করার চেষ্টা করার পরে আমি এমন সমাধান খুঁজে পেয়েছি যা আমার জন্য কবজির মতো কাজ করেছে।

App_Start ফোল্ডারে WebApiConfig ফাইলটিতে কোডের সমস্ত লাইনে মন্তব্য করুন এবং নিম্নলিখিত কোডটি যুক্ত করুন:

`public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.EnableCors();
        var enableCorsAttribute = new EnableCorsAttribute("*",
                                           "Origin, Content-Type, Accept",
                                           "GET, PUT, POST, DELETE, OPTIONS");
        config.EnableCors(enableCorsAttribute);
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            //routeTemplate: "api/{controller}/{id}",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        config.Formatters.Add(new BrowserJsonFormatter());
    }

    public class BrowserJsonFormatter : JsonMediaTypeFormatter
    {
        public BrowserJsonFormatter()
        {
            this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
            this.SerializerSettings.Formatting = Formatting.Indented;
        }

        public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
        {
            base.SetDefaultContentHeaders(type, headers, mediaType);
            headers.ContentType = new MediaTypeHeaderValue("application/json");
        }
    }`

0

আমি জানি যে লোকেরা সম্ভবত এটি প্রথমে খুব সুস্পষ্ট দেখতে পাবে, তবে সত্যই এটি সম্পর্কে ভাবেন। আপনি যদি কিছু ভুল করে থাকেন তবে এটি প্রায়শই ঘটতে পারে।

উদাহরণস্বরূপ, আমার এই সমস্যাটি হয়েছিল কারণ আমি আমার হোস্ট ফাইলটিতে হোস্ট এন্ট্রি যোগ করি নি। আসল সমস্যাটি ছিল ডিএনএস রেজোলিউশন। অথবা আমি ঠিক বেস URL টি ভুল পেয়েছি।

পরিচয় টোকেনটি যদি একটি সার্ভার থেকে আসে তবে কখনও কখনও আমি এই ত্রুটিটি পাই তবে আমি অন্যটিতে এটি ব্যবহার করার চেষ্টা করছি।

আপনি যদি রিসোর্সটি ভুল করে থাকেন তবে কখনও কখনও আপনি এই ত্রুটিটি পেয়ে যাবেন।

আপনি যদি করস মিডলওয়্যারটিকে শৃঙ্খলে খুব দেরি করে রাখেন তবে আপনি এটি পেতে পারেন।


0

সিআরএস সক্ষম করার জন্য একাধিক স্থান এড়িয়ে চলুন, যেমন WebApiCOnfig.cs, গ্র্যান্ট রিসোর্স ওয়ানার শংসাপত্রের পদ্ধতি এবং সরবরাহকারীর নিয়ামক শিরোনাম বৈশিষ্ট্য ইত্যাদি এড়ান নিচে নীচে তালিকাগুলি যা অ্যাক্সেস নিয়ন্ত্রণের উত্সকেও অনুমোদন দেয়

  1. আপনি যে ডিবি ব্যবহার করেছেন তার সাথে আলাপচারিতায় ওয়েবের অসুবিধা হচ্ছে।
  2. এডাব্লুএস ক্লাউড যদি ওয়েব এপিআই এবং ডিবি এর ভিপিসি আলাদা হয়।

অ্যাক্সেস নিয়ন্ত্রণ অনুমোদনের উত্স ঠিক করতে যথেষ্ট নীচে কোড রয়েছে। // নিশ্চিত হয়ে নিন অ্যাপ্লিকেশন। ইউসকর্সটি কনফিগারেশনের কোড লাইনের শীর্ষে থাকা উচিত।

   public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
            //All other configurations
        }
    }

এটি আমার সমস্যাটিকে ধীর করে দিয়েছে।


0

আপনি যখন অন্য কোনও ডোমেন বা ভিন্ন বন্দর থেকে অ্যাক্সেস করার চেষ্টা করেন তখন এই সমস্যাটি ঘটে।

আপনি যদি ভিজ্যুয়াল স্টুডিও ব্যবহার করছেন তবে টুলস> নুগেট প্যাকেজ ম্যানেজার> প্যাকেজ ম্যানেজার কনসোলে যান। সেখানে আপনাকে নুগেট প্যাকেজ মাইক্রোসফ্ট ইনস্টল করতে হবে spএএসপনেট.ওয়েবএপি.কর্স

Install-Package Microsoft.AspNet.WebApi.Cors

তারপরে, প্রকল্প> অ্যাপ্লিকেশন_সার্ট> ওয়েবএপিআইফোনফিগে, সিওআরএস সক্ষম করুন

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        
        //Enable CORS. Note that the domain doesn't have / in the end.
        config.EnableCors(new EnableCorsAttribute("https://tiagoperes.eu",headers:"*",methods:"*"));

        ....

    }
}

সফলভাবে ইনস্টল হয়ে গেলে সমাধানটি তৈরি করুন এবং এটি যথেষ্ট should

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.