এএসপি.নেট ওয়েব এপিআই সহ জেএসএনপি


136

আমি ওয়েব এপিআই ব্যবহার করে এএসপি.এমভিসি এমভিসি 4 তে একটি নতুন সেট পরিষেবা তৈরির জন্য কাজ করছি। এখন পর্যন্ত, এটি দুর্দান্ত। আমি পরিষেবাটি তৈরি করেছি এবং এটি কাজ করতে পেলাম, এবং এখন আমি জিকুয়েরি ব্যবহার করে এটি গ্রাস করার চেষ্টা করছি। আমি ফিডলারের সাহায্যে জেএসএন স্ট্রিংটি ফিরে পেতে পারি এবং এটি ঠিক আছে বলে মনে হচ্ছে তবে পরিষেবাটি একটি পৃথক সাইটে উপস্থিত থাকার কারণে এটি "অনুমোদিত নয়" দিয়ে জিকুয়েরি ত্রুটিগুলি দিয়ে কল করার চেষ্টা করছে। সুতরাং, এটি স্পষ্টভাবে একটি ক্ষেত্রে যেখানে আমার জেএসএনপি ব্যবহার করা দরকার।

আমি জানি যে ওয়েব এপিআই নতুন, তবে আমি আশা করি সেখানে উপস্থিত কেউ আমাকে সহায়তা করতে পারে।

আমি কীভাবে JSONP ব্যবহার করে কোনও ওয়েব এপিআই পদ্ধতিতে কল করব?


1
চ্যানেল 9-এ স্কটগু ভিডিও দেখার পরে এবং স্কট হ্যানসেলম্যান নিবন্ধটি পড়ার পরে নতুন ওয়েব এপিআই কাঠামোর সন্ধান করছিলাম এবং এটিই আমার প্রথম চিন্তা / প্রশ্নগুলির মধ্যে এটি।
ট্র্যাকার 1

উত্তর:


132

এই প্রশ্নটি জিজ্ঞাসা করার পরে, অবশেষে আমার কী প্রয়োজন তা খুঁজে পেয়েছি, তাই আমি এর উত্তর দিচ্ছি।

আমি এই JsonpMediaType Formatter জুড়ে ছুটে এসেছি । এটি করে Application_Startআপনার গ্লোবাল.এক্সেক্সের মধ্যে এটি যুক্ত করুন :

var config = GlobalConfiguration.Configuration;
config.Formatters.Insert(0, new JsonpMediaTypeFormatter());

এবং আপনি এই জাতীয় দেখতে একটি JQuery AJAX কল সঙ্গে যেতে ভাল:

$.ajax({
    url: 'http://myurl.com',
    type: 'GET',
    dataType: 'jsonp',
    success: function (data) {
        alert(data.MyProperty);
    }
})

এটা খুব ভাল কাজ বলে মনে হচ্ছে।


আমার ক্ষেত্রে এটি কাজ করছে বলে মনে হচ্ছে না, যেখানে আমি ইতিমধ্যে জসন. নেট সিরিয়ালাইজেশনের জন্য একটি ফর্ম্যাটর যুক্ত করেছি। কোন ধারনা?
জাস্টিন

4
আমার বিশ্বাস, এমভিসি 4 আরসি সংস্করণ forums.asp.net/post/5102318.aspx
দিগন্ত কুমার

13
কোডটি এখন নিউগেটে ওয়েবএপিপিঅন্টিব্রিজের অংশ। এটিকে ম্যানুয়ালি টানতে হবে না।
জন অনস্টট

7
হ্যাঁ, এখন ঠিক: "ইনস্টল-প্যাকেজ ওয়েবএপিআইকন্ট্রিবি.ফর্ম্যাটিং.জসনপ" ডকো এখানে রয়েছে: nuget.org/packages/WebApiContrib. Formatting.Jsonp
নটন

4
এটিই হ'ল আজকের নুগেট ডাউনলোডটি ব্যবহার করে:GlobalConfiguration.Configuration.AddJsonpFormatter(config.Formatters.JsonFormatter, "callback");
joym8

52

এখানে ওয়েবএপিআই আরসির সাথে ব্যবহারের জন্য জসনপমিডিয়া টাইপ ফর্ম্যাটারের একটি আপডেট সংস্করণ রয়েছে:

public class JsonpMediaTypeFormatter : JsonMediaTypeFormatter
{
    private string callbackQueryParameter;

    public JsonpMediaTypeFormatter()
    {
        SupportedMediaTypes.Add(DefaultMediaType);
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/javascript"));

        MediaTypeMappings.Add(new UriPathExtensionMapping("jsonp", DefaultMediaType));
    }

    public string CallbackQueryParameter
    {
        get { return callbackQueryParameter ?? "callback"; }
        set { callbackQueryParameter = value; }
    }

    public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContent content, TransportContext transportContext)
    {
        string callback;

        if (IsJsonpRequest(out callback))
        {
            return Task.Factory.StartNew(() =>
            {
                var writer = new StreamWriter(stream);
                writer.Write(callback + "(");
                writer.Flush();

                base.WriteToStreamAsync(type, value, stream, content, transportContext).Wait();

                writer.Write(")");
                writer.Flush();
            });
        }
        else
        {
            return base.WriteToStreamAsync(type, value, stream, content, transportContext);
        }
    }


    private bool IsJsonpRequest(out string callback)
    {
        callback = null;

        if (HttpContext.Current.Request.HttpMethod != "GET")
            return false;

        callback = HttpContext.Current.Request.QueryString[CallbackQueryParameter];

        return !string.IsNullOrEmpty(callback);
    }
}

8
অসাধারণ ধন্যবাদ, যদিও আমি বিশ্বাস করি WritToStreamAsync একটি এইচটিপসি কনটেন্ট গ্রহণ করা উচিত একটি এইচটিটিপি কনটেন্টহাইডার্স এখন চূড়ান্ত প্রকাশে আপত্তি জানায় না, তবে সেই পরিবর্তনটি একটি কবজির মতো কাজ করেছিল
বেন

21

আপনি এটির মতো একটি অ্যাকশনফিলারঅ্যাট্রিবিউট ব্যবহার করতে পারেন:

public class JsonCallbackAttribute : ActionFilterAttribute
{
    private const string CallbackQueryParameter = "callback";

    public override void OnActionExecuted(HttpActionExecutedContext context)
    {
        var callback = string.Empty;

        if (IsJsonp(out callback))
        {
            var jsonBuilder = new StringBuilder(callback);

            jsonBuilder.AppendFormat("({0})", context.Response.Content.ReadAsStringAsync().Result);

            context.Response.Content = new StringContent(jsonBuilder.ToString());
        }

        base.OnActionExecuted(context);
    }

    private bool IsJsonp(out string callback)
    {
        callback = HttpContext.Current.Request.QueryString[CallbackQueryParameter];

        return !string.IsNullOrEmpty(callback);
    }
}

তারপরে এটি আপনার ক্রিয়াতে রাখুন:

[JsonCallback]
public IEnumerable<User> User()
{
    return _user;
}

VS2013 U5, MVC5.2 এবং WebApi 2 এর সাথে নিখুঁতভাবে কাজ করেছেন
ইয়ারলা

11

অবশ্যই ব্রায়ানের উত্তর সঠিক one এটি যেভাবেই হোক এটি ব্যবহার করা ভাল ধারণা, যেমন স্কট হ্যানসেলম্যান বলেছে যে এএসপি.নেট ওয়েব এপিআই প্রকাশের ফলে ডিফল্টরূপে জসন.নেট সিরিয়ালাইজার ব্যবহার করতে চলেছে।

public class JsonNetFormatter : MediaTypeFormatter
    {
        private JsonSerializerSettings _jsonSerializerSettings;
        private string callbackQueryParameter;

        public JsonNetFormatter(JsonSerializerSettings jsonSerializerSettings)
        {
            _jsonSerializerSettings = jsonSerializerSettings ?? new JsonSerializerSettings();

            // Fill out the mediatype and encoding we support
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
            Encoding = new UTF8Encoding(false, true);

            //we also support jsonp.
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/javascript"));
            MediaTypeMappings.Add(new UriPathExtensionMapping("jsonp", "application/json"));
        }

        public string CallbackQueryParameter
        {
            get { return callbackQueryParameter ?? "jsoncallback"; }
            set { callbackQueryParameter = value; }
        }

        protected override bool CanReadType(Type type)
        {
            if (type == typeof(IKeyValueModel))
                return false;

            return true;
        }

        protected override bool CanWriteType(Type type)
        {
            return true;
        }

        protected override Task<object> OnReadFromStreamAsync(Type type, Stream stream, HttpContentHeaders contentHeaders,
            FormatterContext formatterContext)
        {
            // Create a serializer
            JsonSerializer serializer = JsonSerializer.Create(_jsonSerializerSettings);

            // Create task reading the content
            return Task.Factory.StartNew(() =>
            {
                using (StreamReader streamReader = new StreamReader(stream, Encoding))
                {
                    using (JsonTextReader jsonTextReader = new JsonTextReader(streamReader))
                    {
                        return serializer.Deserialize(jsonTextReader, type);
                    }
                }
            });
        }

        protected override Task OnWriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders,
            FormatterContext formatterContext, TransportContext transportContext)
        {
            string callback;
            var isJsonp = IsJsonpRequest(formatterContext.Response.RequestMessage, out callback);

            // Create a serializer
            JsonSerializer serializer = JsonSerializer.Create(_jsonSerializerSettings);

            // Create task writing the serialized content
            return Task.Factory.StartNew(() =>
            {
                using (JsonTextWriter jsonTextWriter = new JsonTextWriter(new StreamWriter(stream, Encoding)) { CloseOutput = false })
                {
                    if (isJsonp)
                    {
                        jsonTextWriter.WriteRaw(callback + "(");
                        jsonTextWriter.Flush();
                    }

                    serializer.Serialize(jsonTextWriter, value);
                    jsonTextWriter.Flush();

                    if (isJsonp)
                    {
                        jsonTextWriter.WriteRaw(")");
                        jsonTextWriter.Flush();
                    }
                }
            });
        }

        private bool IsJsonpRequest(HttpRequestMessage request, out string callback)
        {
            callback = null;

            if (request.Method != HttpMethod.Get)
                return false;

            var query = HttpUtility.ParseQueryString(request.RequestUri.Query);
            callback = query[CallbackQueryParameter];

            return !string.IsNullOrEmpty(callback);
        }
    }

আমরা এএসপি। নেট ওয়েব এপিআই আরসির জন্য এটি কীভাবে করতে পারি?
jonperl

আরসি সংস্করণেও আগ্রহী
থমাস স্টক


6

জেএসএনপি কেবল এইচটিপিপি জিইটি অনুরোধের সাথে কাজ করে। এসপ নেট ওয়েব এপিআই-তে একটি কর্স সমর্থন রয়েছে যা সমস্ত http ক্রিয়াপদের সাথে ভালভাবে কাজ করে।

এই নিবন্ধটি আপনার পক্ষে সহায়ক হতে পারে।


1
ওয়েব এপিআই-তে এখন CORS সমর্থন রয়েছে। এই নিবন্ধটি বেশ সহায়ক - asp.net/web-api/overview/security/…
ইলিয়া বারাহোভস্কি

5

আপডেট করা হয়েছে

public class JsonpMediaTypeFormatter : JsonMediaTypeFormatter
    {
        private string callbackQueryParameter;

        public JsonpMediaTypeFormatter()
        {
            SupportedMediaTypes.Add(DefaultMediaType);
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/javascript"));

            MediaTypeMappings.Add(new UriPathExtensionMapping("jsonp", DefaultMediaType));
        }

        public string CallbackQueryParameter
        {
            get { return callbackQueryParameter ?? "callback"; }
            set { callbackQueryParameter = value; }
        }

        public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
        {
            string callback;

            if (IsJsonpRequest(out callback))
            {
                return Task.Factory.StartNew(() =>
                {
                    var writer = new StreamWriter(writeStream);
                    writer.Write(callback + "(");
                    writer.Flush();

                    base.WriteToStreamAsync(type, value, writeStream, content, transportContext).Wait();

                    writer.Write(")");
                    writer.Flush();
                });
            }
            else
            {
                return base.WriteToStreamAsync(type, value, writeStream, content, transportContext);
            }
        }

        private bool IsJsonpRequest(out string callback)
        {
            callback = null;

            if (HttpContext.Current.Request.HttpMethod != "GET")
                return false;

            callback = HttpContext.Current.Request.QueryString[CallbackQueryParameter];

            return !string.IsNullOrEmpty(callback);
        }
    }

ধন্যবাদ, অন্যান্য সংস্করণ সর্বশেষ। নেট ফ্রেমওয়ার্কে কাজ করে না।
djbielejeski

2

বেশ কয়েকটি উন্নতি সহ এখানে একটি আপডেট সংস্করণ রয়েছে যা ওয়েব API এর আরটিএম সংস্করণে কাজ করে।

  • অনুরোধের নিজস্ব Accept-Encodingশিরোনামের ভিত্তিতে সঠিক এনকোডিং নির্বাচন করে । new StreamWriter()পূর্ববর্তী উদাহরণ মধ্যে কেবল হল UTF-8 ব্যবহার করেন। কলটিতে base.WriteToStreamAsyncএকটি পৃথক এনকোডিং ব্যবহার করা যেতে পারে যার ফলস্বরূপ ক্ষতিগ্রস্থ হয়েছে।
  • মানচিত্র JSONP application/javascript Content-Typeশিরোনামের কাছে অনুরোধ ; পূর্ববর্তী উদাহরণটি JSONP আউটপুট দেয় তবে application/jsonশিরোলেখ দিয়ে। এই কাজটি নেস্টেড Mappingক্লাসে করা হয়েছে (সিএফ। জেএসওএনপি পরিবেশন করার জন্য সেরা সামগ্রীর প্রকার? )
  • এ এর নির্মাণ ও ফ্ল্যাশিং ওভারহেডকে পূর্বে করে StreamWriterএবং সরাসরি বাইটগুলি পায় এবং সেগুলি আউটপুট প্রবাহে লেখায়।
  • কোনও কাজের জন্য অপেক্ষা করার পরিবর্তে, টাস্ক প্যারালাল লাইব্রেরির ContinueWithপ্রক্রিয়াটি একসাথে বেশ কয়েকটি কার্যকে শৃঙ্খলাবদ্ধ করতে ব্যবহার করুন ।

কোড:

public class JsonpMediaTypeFormatter : JsonMediaTypeFormatter
{
  private string _callbackQueryParameter;

  public JsonpMediaTypeFormatter()
  {
    SupportedMediaTypes.Add(DefaultMediaType);
    SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/javascript"));

    // need a lambda here so that it'll always get the 'live' value of CallbackQueryParameter.
    MediaTypeMappings.Add(new Mapping(() => CallbackQueryParameter, "application/javascript"));
  }

  public string CallbackQueryParameter
  {
    get { return _callbackQueryParameter ?? "callback"; }
    set { _callbackQueryParameter = value; }
  }

  public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content,
                                          TransportContext transportContext)
  {
    var callback = GetCallbackName();

    if (!String.IsNullOrEmpty(callback))
    {
      // select the correct encoding to use.
      Encoding encoding = SelectCharacterEncoding(content.Headers);

      // write the callback and opening paren.
      return Task.Factory.StartNew(() =>
        {
          var bytes = encoding.GetBytes(callback + "(");
          writeStream.Write(bytes, 0, bytes.Length);
        })
      // then we do the actual JSON serialization...
      .ContinueWith(t => base.WriteToStreamAsync(type, value, writeStream, content, transportContext))

      // finally, we close the parens.
      .ContinueWith(t =>
        {
          var bytes = encoding.GetBytes(")");
          writeStream.Write(bytes, 0, bytes.Length);
        });
    }
    return base.WriteToStreamAsync(type, value, writeStream, content, transportContext);
  }

  private string GetCallbackName()
  {
    if (HttpContext.Current.Request.HttpMethod != "GET")
      return null;
    return HttpContext.Current.Request.QueryString[CallbackQueryParameter];
  }

  #region Nested type: Mapping

  private class Mapping : MediaTypeMapping
  {
    private readonly Func<string> _param; 

    public Mapping(Func<string> discriminator, string mediaType)
      : base(mediaType)
    {
      _param = discriminator;
    }

    public override double TryMatchMediaType(HttpRequestMessage request)
    {
      if (request.RequestUri.Query.Contains(_param() + "="))
        return 1.0;
      return 0.0;
    }
  }

  #endregion
}

আমি Func<string>অভ্যন্তরীণ বর্গ নির্মাণকারীর প্যারামিটারের "হ্যাকনেস" সম্পর্কে সচেতন , তবে এটি যে সমস্যার সমাধান করে তা ঘিরে ধরার দ্রুততম উপায় ছিল - যেহেতু সি # কেবল স্থির অভ্যন্তরীণ ক্লাসে রয়েছে তাই এটি CallbackQueryParameterসম্পত্তিটি দেখতে পারে না । পাসিং Funcল্যামডা সম্পত্তি শুশ্রূষা, তাই Mappingউপর পরে এটি অ্যাক্সেস করতে সক্ষম হবে TryMatchMediaType। আপনার যদি আরও মার্জিত উপায় থাকে তবে মন্তব্য করুন!


2

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


1

জোহপারল, টমাস উপরের পিটার মোবার্গের দেওয়া উত্তরটি আরসি সংস্করণটির জন্য সঠিক হওয়া উচিত কারণ তিনি জেসনমিডিয়া টাইপফর্ম্যাটরটি উত্তরাধিকার সূত্রে পেয়েছেন যেটি নিউটনসফট জসন সিরিয়ালাইজারটি ইতিমধ্যে ব্যবহার করেছে এবং তাই তার যা আছে তা কোনও পরিবর্তন নিয়ে কাজ করা উচিত।

তবে, পৃথিবীতে লোকেরা কেন এখনও প্যারামিটার ব্যবহার করছে, যখন আপনি কেবল নিম্নলিখিতটি করতে পারেন

public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, TransportContext transportContext)
        {
            var isJsonpRequest = IsJsonpRequest();

            if(isJsonpRequest.Item1)
            {
                return Task.Factory.StartNew(() =>
                {
                    var writer = new StreamWriter(stream);
                    writer.Write(isJsonpRequest.Item2 + "(");
                    writer.Flush();
                    base.WriteToStreamAsync(type, value, stream, contentHeaders, transportContext).Wait();
                    writer.Write(")");
                    writer.Flush();
                });
            }

            return base.WriteToStreamAsync(type, value, stream, contentHeaders, transportContext);
        }

        private Tuple<bool, string> IsJsonpRequest()
        {
            if(HttpContext.Current.Request.HttpMethod != "GET")
                return new Tuple<bool, string>(false, null);

            var callback = HttpContext.Current.Request.QueryString[CallbackQueryParameter];

            return new Tuple<bool, string>(!string.IsNullOrEmpty(callback), callback);
        }

1

আপনার নিজের JSONP ফর্ম্যাটর সংস্করণটি হোস্টিংয়ের পরিবর্তে আপনি ইতিমধ্যে বাস্তবায়িত একটি ( Web .piContrib. Formatting.Jsonp NuGet প্যাকেজ ইনস্টল করতে পারেন (আপনার। নেট ফ্রেমওয়ার্কের জন্য কাজ করে এমন সংস্করণটি চয়ন করুন)।

এই বিন্যাসটি এতে যুক্ত করুন Application_Start:

GlobalConfiguration.Configuration.Formatters.Insert(0, new JsonpMediaTypeFormatter(new JsonMediaTypeFormatter()));

0

আপনারা যারা এইচটিটিপিএসফেলহস্ট সার্ভার ব্যবহার করছেন তাদের ক্ষেত্রে এই বিভাগের কোডটি এইচটিটিপি কনটেক্সট.ক্রেনারে ব্যর্থ হবে, যেহেতু এটি স্ব-হোস্ট সার্ভারে নেই।

private Tuple<bool, string> IsJsonpRequest()
{
if(HttpContext.Current.Request.HttpMethod != "GET")
 return new Tuple<bool, string>(false, null);
 var callback = HttpContext.Current.Request.QueryString[CallbackQueryParameter];
 return new Tuple<bool, string>(!string.IsNullOrEmpty(callback), callback);
 }

তবে আপনি এই ওভাররাইডের মাধ্যমে স্ব হোস্ট "প্রসঙ্গ" বাধা দিতে পারেন।

public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, HttpRequestMessage request, MediaTypeHeaderValue mediaType)
        {
            _method = request.Method;
            _callbackMethodName =
                request.GetQueryNameValuePairs()
                       .Where(x => x.Key == CallbackQueryParameter)
                       .Select(x => x.Value)
                       .FirstOrDefault();

            return base.GetPerRequestFormatterInstance(type, request, mediaType);
        }

অনুরোধ.মাথোদ আপনাকে "জিইটি", "পোষ্ট" ইত্যাদি দেবে এবং গেটকুয়েরি নামভ্যালু পেয়ারস? কলব্যাক প্যারামিটারটি পুনরুদ্ধার করতে পারে। এইভাবে আমার সংশোধিত কোডটি দেখে মনে হচ্ছে:

private Tuple<bool, string> IsJsonpRequest()
 {
     if (_method.Method != "GET")
     return new Tuple<bool, string>(false, null);

     return new Tuple<bool, string>(!string.IsNullOrEmpty(_callbackMethodName), _callbackMethodName);
}

আশা করি এটি আপনার কয়েকজনকে সহায়তা করবে। এইভাবে আপনার অগত্যা কোনও এইচটিপিপেক্সটেক্সট শিমের দরকার নেই।

সি



0

যদি প্রসঙ্গটি হয় Web Api, ধন্যবাদ এবং 010227leoএর উত্তর উল্লেখ করে , আপনাকে অবশ্যই WebContext.Currentমান বিবেচনা করতে হবে যা হতে চলেছে null

সুতরাং আমি তার কোডটি এতে আপডেট করেছি:

public class JsonCallbackAttribute
    : ActionFilterAttribute
{
    private const string CallbackQueryParameter = "callback";

    public override void OnActionExecuted(HttpActionExecutedContext context)
    {
        var callback = context.Request.GetQueryNameValuePairs().Where(item => item.Key == CallbackQueryParameter).Select(item => item.Value).SingleOrDefault();

        if (!string.IsNullOrEmpty(callback))
        {
            var jsonBuilder = new StringBuilder(callback);

            jsonBuilder.AppendFormat("({0})", context.Response.Content.ReadAsStringAsync().Result);

            context.Response.Content = new StringContent(jsonBuilder.ToString());
        }

        base.OnActionExecuted(context);
    }
}

0

আমরা দুটি উপায় ব্যবহার করে CORS (ক্রস-অরিজিন রিসোর্স ভাগ করে নেওয়া) সমস্যার সমাধান করতে পারি,

1) জসনপ ব্যবহার 2) করগুলি সক্ষম করা

1) জসনপ- ব্যবহার করে জসনপ ব্যবহার করতে আমাদের ওয়েবএপিপি-কনট্রিব.ফর্ম্যাটিং.জসনপ নুগেট প্যাকেজ ইনস্টল করতে হবে এবং ওয়েবআপিসিফিগ.সি.সি-তে স্ক্রিনশটগুলি উল্লেখ করে জসনপফর্মমাটার যুক্ত করতে হবে,এখানে চিত্র বর্ণনা লিখুন

Jquery কোড এখানে চিত্র বর্ণনা লিখুন

2) করগুলি সক্ষম করা -

কর্সগুলি সক্ষম করতে আমাদের মাইক্রোসফ্ট.এস্পনেট.ওয়েবপিপি.কর্স নুগেট প্যাকেজ যুক্ত করতে হবে এবং স্ক্রিনশটটি রেফার করে WebApiConfig.cs এ করগুলি সক্ষম করা দরকার

এখানে চিত্র বর্ণনা লিখুন

আরও রেফারেন্সের জন্য, আপনি নীচের লিঙ্কটি ব্যবহার করে আমার নমুনা রেপোটি গিটহাবে রেফার করতে পারেন। https://github.com/mahesh353/Ninject.WebAPi/tree/develop

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