আমি কীভাবে এইএসপি.নেট এমভিসি 1 তে এইচটিটিপি কনটেক্সটবেস থেকে একটি এইচটিপিপি কনটেক্সট অবজেক্ট পাব?


154

আমি কয়েকটি ওয়েবফরম / এমভিসি-অজোনস্টিক সরঞ্জাম নিয়ে কাজ করছি এবং আমার HttpContextকোনও HttpContextBaseঅবজেক্টের রেফারেন্স দেওয়ার উদাহরণ পাওয়া দরকার । আমি ব্যবহার করতে পারছি না HttpContext.Currentকারণ অ্যাসিক্রোনাসলি পাশাপাশি কাজ করার জন্যও আমার এটি দরকার ( অ্যাসিঙ্ক্রোনাস অনুরোধের সময় HttpContext.Currentরিটার্ন null)। আমি সচেতন HttpContextWrapper, কিন্তু ভুল পথে চলে।

উত্তর:


249

সহজ উপায় হ'ল অ্যাপ্লিকেশনটি পাওয়া ApplicationInstanceএবং এর Contextসম্পত্তিটি ব্যবহার করা :

// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;

( মন্তব্যগুলিতে এটি উল্লেখ করেছেন ইসমাইল স্মারনোকে ধন্যবাদ )

আসল উত্তর:

আপনি করতে পারেন, বিশেষত যদি আপনার HttpContextBaseহাতে দেওয়া উদাহরণটি HttpContextWrapperরান-টাইমে টাইপের হয়। নীচের উদাহরণটি ব্যাখ্যা করে যে আপনি কীভাবে এটি করতে পারেন। এটি অনুমান করে যে আপনার কাছে এমন একটি পদ্ধতি আছে Fooযা প্রসঙ্গটি গ্রহণ করে HttpContextBaseতবে তৃতীয় পক্ষের অ্যাসেমব্লিতে এমন একটি পদ্ধতি কল করা দরকার (যাতে আপনার সংশোধন করার সৌভাগ্য হয় না) যা প্রসঙ্গটি টাইপ হওয়ার প্রত্যাশা করে HttpContext

void Foo(HttpContextBase context) 
{
    var app = (HttpApplication) context.GetService(typeof(HttpApplication));
    ThirdParty.Bar.Baz(app.Context);
}

// Somewhere in assembly and namespace ThirdParty,
// in a class called Bar, there is Baz expecting HttpContext:

static void Baz(HttpContext context) { /* ... */ }

HttpContextBaseGetServiceসমর্থনের ফলস্বরূপ বলা একটি পদ্ধতি রয়েছে IServiceProviderGetServiceএর ওভাররাইড HttpContextWrapperকরার প্রতিনিধিদের GetServiceআবৃত বাস্তবায়ন HttpContextউদাহরণস্বরূপ। GetServiceবাস্তবায়ন HttpContextমত স্বাভাবিক সন্দেহভাজন জন্য আপনার জিজ্ঞাসিত প্রশ্নের আপনি করতে পারবেন HttpApplication, HttpRequest, HttpResponseইত্যাদি। এটি ঠিক তখন ঘটে থাকে যার HttpApplicationএকটি প্রচ্ছদ নামক সম্পত্তি রয়েছে এবং এটি একটি উদাহরণ দেয় HttpContext। তাই এক আবৃত পায় HttpContextজিজ্ঞাসা করে দৃষ্টান্ত HttpContextBaseজন্য HttpApplicationমাধ্যমে GetServiceঅনুসৃত পড়ার মাধ্যমে Contextফিরে সম্পত্তিরHttpApplication উদাহরণস্বরূপ।

এর বিপরীতে HttpContextBase, এর GetServiceসর্বজনীন সদস্য হিসাবে উপস্থিত হয় না HttpContextতবে এটি হ'ল স্পষ্টতাকে HttpContextপ্রয়োগ IServiceProvider.GetServiceকরেHttpContextBase করে।

মনে রাখবেন যে Fooএটি আর পরীক্ষাযোগ্য নয় কারণ এটি অন্তর্নিহিত আবরণটি সক্ষম করতে নির্ভর করেHttpContext সময় এবং এটি প্রথমে নকল / স্টাবের পক্ষে অসম্ভব is এই উত্তরের মূল বিষয়টি, তবে এই প্রশ্নটি সম্বোধন করা, "আমি কীভাবে এইচটিটিপি কনটেক্সটবেস থেকে একটি এইচটিপিপেক্সটেক্সট অবজেক্ট পাব?", আক্ষরিকভাবে । ইলাস্ট্রেটেড টেকনিক সেই পরিস্থিতিতে কার্যকর যেখানে আপনি নিজেকে এমন উপাদানগুলির মধ্যে স্যান্ডউইচড খুঁজে পান যেখানে আপনার প্রয়োজনীয় সংশোধন করার বিলাসিতা থাকে না।


3
খুব আকর্ষণীয় উত্তর, লগিংয়ের জন্য একটি ত্রুটি ফিল্টার থেকে ELMAH এ এইচটিপপেক্সটেক্সট পাস করার জন্য কেবল এমভিসিতে নিজেকে এটি ব্যবহার করেছি।
ক্রিস মেরিসিক

1
সুন্দর উত্তর, বেট যে খনন একটি বিট লাগল? :)
দীর্ঘহায়ারসি

দুর্দান্ত উত্তর! আমি বিশেষত আমার এলামাহাতে এমভিসি নিয়ন্ত্রণকারী github.com/alexenderbeletsky/elmah.mvc.controller/blob/master/… এ ব্যবহার করেছি
আলেকজান্ডার ব্লেটস্কি

35
এইচটিটিপি কনটেক্সটবেস দিয়ে, আপনি কল করতে পারবেন না context.ApplicationInstance.Context?
ইসমাইল স্মারনু

@ ইশমেলস্মিরনু এটি ঘৃণা করুন, আমি কীভাবে মিস করি না যে সমস্ত Http*Baseপরিবর্তনের মধ্য দিয়ে ফিরে এসেছি HttpContextBase। : পি আমি উত্তর আপডেট করব।
আতিফ আজিজ


14

আপনি পারবেন না।

পুরো উদ্দেশ্য HttpContextBaseহ'ল কংক্রিট HttpContextশ্রেণীর উপর নির্ভরতা দূরে রাখা । এটা যদিও পারে একটি কংক্রিট ধারণ HttpContext (সঙ্গে কেস যেমন httpContextWrapper) , অন্যান্য বাস্তবায়নের একেবারে কিছুই না করতে হতে পারে HttpContext

আপনার সেরা বিকল্প একটি কাস্টম সারাংশ কারখানার করে একটি পেতে পারেন সংজ্ঞায়িত হয় HttpContextBaseতোমার জন্য, যেহেতু আপনি সবসময় একটি কংক্রিট মোড়ানো পারেন HttpContextএকটি HttpContextWrapper


12
এটি, যাইহোক, ভয়াবহভাবে করা হয়েছিল - আমি ইউনিট পরীক্ষার জন্য একটি সেটআপ রাখতে চাই বুঝতে পেরেছি এবং আমি বিমূর্ততার স্তরগুলি বুঝতে পারি - তবে আপনি যখন এইচটিপিএনটেক্সট প্রত্যাশিত বিদ্যমান এএসপি.এনইটি ক্লাস ব্যবহার করতে চান তখন আপনার কী করা উচিত? (যেমন msdn.microsoft.com/en-us/library/... )
marq

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