কীভাবে বিশ্বব্যাপী এএসপি.নেট ওয়েব এপিআই ফিল্টার যুক্ত করবেন?


98

আমি একটি ওয়েব এপিআই ফিল্টার তৈরি করেছি (ব্যবহার করে System.Web.Http.Filters.ActionFilterAttribute) তবে এটিএসপি-নেট এমভিসির অভ্যন্তরে কাজ করতে আমি অক্ষম 4.. আমি এটিকে RegisterGlobalFilters()পদ্ধতিতে যুক্ত করার চেষ্টা করেছি কিন্তু এটি কার্যকর হয়নি।

সুতরাং যদি কেউ এএসপি.নেট এমভিসি তে হোস্ট করা ওয়েব অপি ব্যবহার করে তবে একজন কীভাবে ফিল্টার নিবন্ধন করে?

উত্তর:


110

আমার গ্লোবাল.এক্সএক্সে নিম্নলিখিত কোডগুলি আমার পক্ষে কাজ করে:

public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
  filters.Add(new MyWebApiFilter());
}

protected void Application_Start()
{
  RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}

6
এখানে কি চলছে কেউ ব্যাখ্যা করতে পারেন? গ্লোবাল ফিল্টারগুলির দুটি সেট কেন? এটি কি 'গ্লোবাল' কে একটি অক্সিমারন করে না?
লুক পুপলেট

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

4
আমার ওয়েবএপি ফিল্টারটি দু'বার কল করা হয়। কারও কি এই সমস্যা আছে?
অ্যান্ড্রু কালাশনিকভ

87

নোট করুন যে এই উত্তরটি এমভিসি 5 / ওয়েব এপিআই 2 অবধি সত্য holds

সংক্ষিপ্ত উত্তর: এমভিসি এবং ওয়েব এপিআই ফিল্টারগুলি ক্রস সামঞ্জস্যপূর্ণ নয় এবং আপনি যদি বিশ্বব্যাপী এগুলি নিবন্ধন করতে চান তবে আপনাকে অবশ্যই প্রত্যেকের জন্য উপযুক্ত কনফিগারেশন ক্লাস ব্যবহার করতে হবে।

দীর্ঘ উত্তর: এএসপি.এনইটি এমভিসি এবং ওয়েব এপিআই উদ্দেশ্যমূলকভাবে একইভাবে কাজ করার জন্য ডিজাইন করা হয়েছে তবে এগুলি আসলে ভিন্ন ভিন্ন প্রাণী।

ওয়েব এপিআই System.Web.Httpনেমস্পেসের অধীনে বাস করে , এমভিসি System.Web.Mvcনেমস্পেসের অধীনে থাকে । দুজনে সুখে পাশাপাশি থাকবেন, তবে একটিতে অন্যটি থাকে না এবং প্রোগ্রামিং মডেলের মিল থাকলেও অন্তর্নিহিত বাস্তবায়ন আলাদা। এমভিসি নিয়ন্ত্রক এবং ওয়েব এপিআই কন্ট্রোলাররা যেমন বিভিন্ন বেস নিয়ন্ত্রক শ্রেণীর উত্তরাধিকারী হয় (এমভিসি এর কেবল নাম Controllerএবং ওয়েব এপিআই এর নামকরণ করা হয় ApiController) এমভিসি ফিল্টার এবং ওয়েব এপিআই ফিল্টারগুলি বিভিন্ন থেকে উত্তরাধিকারীFilterAttribute শ্রেণীর (উভয় অংশ এই ক্ষেত্রে একই নামের কিন্তু পৃথক শ্রেণীর যা বাস তাদের নিজ নিজ নেমস্পেসে)।

HttpConfigurationআপনি Registerযদি ওয়েবএ্যাকটিভেটরের সাথে কোনও প্রকল্পের টেম্পলেট ব্যবহার করেন তবে ওয়েব এপিআই গ্লোবাল ফিল্টারগুলি পদ্ধতি ওয়েবএপিসিফিগ.সি.সি তে আপনার কাছে উপলভ্য অবজেক্টের মাধ্যমে নিবন্ধিত রয়েছে:

public static void Register(HttpConfiguration config)
{
    //stuff before
    config.Filters.Add(new MyWebApiFilter());
    //stuff after
}

অথবা অন্যথায় গ্লোবাল.এক্সএক্স.সি.এস.

GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter());

এমভিসি গ্লোবাল ফিল্টারগুলি কোনও GlobalFilterCollectionঅবজেক্টের মাধ্যমে নিবন্ধিত হয় , যা RegisterGlobalFiltersওয়েবএ্যাকটিভেটর ব্যবহার করে এমন প্রকল্পগুলির জন্য ফিল্টারকনফিগ.সি.এস এর পদ্ধতির মাধ্যমে আপনার কাছে উপলব্ধ :

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        //stuff before
        filters.Add(new MyMvcFilter());
        //stuff after
    }
}

বা ওয়েবএ্যাকটিভেটরবিহীনদের জন্য GlobalFilters.Filtersসংগ্রহের মাধ্যমে Global.asax.cs ফাইলটিতে :

GlobalFilters.Filters.Add(new MyMvcFilter());

এটি লক্ষণীয় যে উভয় ক্ষেত্রেই আপনাকে উপযুক্ত FilterAttributeধরণের থেকে উত্তরাধিকারী হওয়ার দরকার নেই । ওয়েব এপিআই ফিল্টারগুলির কেবলমাত্র সিস্টেম. ওয়েবে.হট্ট.পি.ফিল্টার ইন্টারফেস প্রয়োগ করা প্রয়োজন, যখন এমভিসি ফিল্টার রেজিস্ট্রেশন পরীক্ষা করে পরীক্ষা করে যাচাই করে যে আপনার শ্রেণি System.Web.Mvcনেমস্পেসে সংজ্ঞায়িত কয়েকটি মুখ্য ফিল্টার ইন্টারফেসের উত্তরাধিকারী হয়েছে ।


ওয়েবপিকনফিগ.সি.এসে কাস্টম ওয়েব এপিআই ফিল্টার যুক্ত করা আমার পক্ষে কাজ করে। গ্লোবাল.এক্সএক্স.এস
টাটিপাকা

ধন্যবাদ @ টাটিপাকা। ওয়েবপিকনফিগ যুক্ত করার কাজ।
গোকুলনাথ

12

এমভিসি 4 আরসি হিসাবে, সঠিক শ্রেণির নামটি এইচটিপি ফিল্টার সংগ্রহ :

public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
    filters.Add(new MyWebApiFilter());
}

protected void Application_Start()
{
    RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}

8

গ্লোবাল ফিল্টার ব্যবহারের পরিবর্তে আমি এটি করতে পছন্দ করি:

[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
   ...
}

এবং তারপরে সমস্ত এপিআই কন্ট্রোলারদের উত্তরাধিকার সূত্রে CustomizedApiControllerBase বৈশ্বিক.অ্যাসেক্স ফাইলটিতে গ্লোবাল ফিল্টারগুলির সাথে তুলনা করে এই পদ্ধতিটি আরও অভিব্যক্তিক।


আমি System.Web.Http.Filters.ActionFilterAttribute থেকে উত্তরাধিকারসূত্রে একটি ফিল্টার তৈরি করেছি এবং এটি প্রয়োজনীয় পদ্ধতিতে সরাসরি এটি ব্যবহার করতে এগিয়ে চলেছি। এটি কেবল কাজ করে, তাই কেন এটি নিবন্ধ করার দরকার নেই?
joedotnot

@ জোয়েডোটনোট এটি "গ্লোবাল" ফিল্টার সম্পর্কিত যা নির্দিষ্ট কোনও নয়। আপনি যদি কোন পদ্ধতিটি ফিল্টার করতে চান তা নির্দিষ্ট করতে পারেন, আপনার পদ্ধতির ঠিক আছে তবে আপনি যখন নিয়ন্ত্রক পদক্ষেপ নির্বিশেষে ফিল্টার করতে চান, আপনার গ্লোবাল ফিল্টার প্রয়োজন।
মাহমুদ মোরাভেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.