HttpContext.Crent নাল অপেক্ষা করার পরে কেন?


90

আমার কাছে নিম্নলিখিত পরীক্ষার ওয়েবএপিআই কোড রয়েছে, আমি প্রোডাকশনে ওয়েবএপিআই ব্যবহার করি না তবে এই প্রশ্নটিতে আমার একটি আলোচনার কারণে আমি এটি তৈরি করেছি: ওয়েবএপিআই অ্যাসিঙ্ক প্রশ্ন

যাইহোক, এখানে আপত্তিকর ওয়েবএপিআই পদ্ধতিটি রয়েছে:

public async Task<string> Get(int id)
{
    var x = HttpContext.Current;
    if (x == null)
    {
        // not thrown
        throw new ArgumentException("HttpContext.Current is null");
    }

    await Task.Run(() => { Task.Delay(500); id = 3; });

    x = HttpContext.Current;
    if (x == null)
    {
        // thrown
        throw new ArgumentException("HttpContext.Current is null");
    }

    return "value";
}

আমি এখানে বিশ্বাস করেছিলাম যে দ্বিতীয় ব্যতিক্রম প্রত্যাশিত কারণ awaitসম্পূর্ণ হওয়ার পরে এটি সম্ভবত অন্য থ্রেডে থাকবে যেখানে HttpContext.Currentথ্রেড-স্ট্যাটিক ভেরিয়েবল হিসাবে উপযুক্ত মানটির আর সমাধান হবে না। এখন, সিঙ্ক্রোনাইজেশন প্রসঙ্গে ভিত্তিতে, এটি অপেক্ষা করার পরে একই থ্রেডে ফিরে যেতে বাধ্য হতে পারে তবে আমি আমার পরীক্ষায় অভিনব কিছু করছি না। এটি কেবল একটি সরল, নিষ্পাপ ব্যবহার await

অন্য প্রশ্নের মন্তব্যে আমাকে বলা হয়েছিল যে HttpContext.Currentঅপেক্ষা করার পরে সমাধান করা উচিত। এই ইঙ্গিতটি নিয়ে এই প্রশ্নটিতে আরও একটি মন্তব্য রয়েছে। তাহলে কি সত্য? সমাধান করা উচিত? আমি মনে করি না, তবে আমি এটি সম্পর্কে একটি অনুমোদনমূলক উত্তর চাই কারণ এটি যথেষ্ট নতুন asyncএবং awaitআমি কোনও নির্দিষ্ট কিছু খুঁজে পাচ্ছি না।

টিএল; ডিআর: একটি পরে HttpContext.Currentসম্ভবত ?nullawait


4
আপনার প্রশ্নটি স্পষ্ট নয় - তুমি বলেছিলে করেছি কি ঘটতে প্রত্যাশিত, এবং মন্তব্য নির্দেশ করে যে যে হয় কি ঘটছে ... তাই কি আপনি বিভ্রান্তিকর হচ্ছে?
জন স্কিটি

@ user2674389, এটি বিভ্রান্তিকর। এটি AspNetSynchronizationContextযে যত্ন নেয় HttpContext, না await। আরও, awaitওয়েব এপিআই এক্সিকিউশন মডেলের জন্য আলাদা থ্রেডে মে (এবং সম্ভবত সম্ভবত) এর ধারাবাহিকতা কলব্যাক দেখা দেয়।
নসররাটিও

একটি
সংলগ্ন

4
@ জোপবিউসবার্গ পৃথক অ্যাসেমব্লি তৈরি করা যখন কেবলমাত্র যখন কোনও অ্যাসেম্বলি থেকে ডাকা হয় যখন কোনও নির্দিষ্ট ওয়েব স্ট্যাকের এইচটিটিপি অনুরোধের প্রেক্ষিতে সম্পাদন করা হয় তখন মনে হয় এটি পরীক্ষার, রক্ষণাবেক্ষণ এবং পুনরায় ব্যবহার করতে পারে challenge
ড্যারেল মিলার

4
পছন্দ করুন আমি ব্যবসার যুক্তিটিকে আসল ওয়েব প্রকল্প থেকে আলাদা করেছি। নির্ভরতা ইনজেকশন ব্যবহার করে আমি ব্যবসায়ের যুক্তির উপরে একটি ওয়েবপি-সচেতন লাইব্রেরি যুক্ত করতে পারি। কিন্তু এই লাইব্রেরিটি ভেঙে যায় যখন ব্যবসার যুক্তিটি .ConfigureAwait(false)লাইনের নিচে কোথাও করেছে । ব্যবসায়ের স্তরটির মাধ্যমে স্পষ্টভাবে কোনও অনুরোধ বা নিয়ন্ত্রণকারী হস্তান্তর করা হয়নি, কারণ এটি ওয়েব-সচেতন নয়। এটি লগিং মডিউলের জন্য উদাহরণস্বরূপ দরকারী যখন ব্যবসায় যুক্তি একটি জেনেরিক লিখলে অনুরোধের বিশদটি ইনজেক্ট করতে পারে TraceInformation
জোপ বেউসনবার্গ

উত্তর:


148

আপনি ASP.NET 4.5 অ্যাপ্লিকেশন লিখছেন এবং 4.5 লক্ষ্য করে তা নিশ্চিত করুন । asyncএবং awaitASP.NET উপর অনির্ধারিত আচরণ আছে, যদি না আপনি উপর 4.5 দৌড়াচ্ছে এবং নতুন "টাস্ক বান্ধব" সিঙ্ক্রোনাইজেশন প্রসঙ্গ ব্যবহার করছেন।

বিশেষত, এর অর্থ আপনার অবশ্যই হয়:

  • সেট httpRuntime.targetFrameworkকরুন 4.5, বা
  • আপনার appSettingsসেট aspnet:UseTaskFriendlySynchronizationContextকরা true

আরও তথ্য এখানে পাওয়া যায়


4
আমি সবেমাত্র একটি নতুন এএসপি.নেট 4.5 ওয়েবএপিআই প্রকল্প তৈরি করেছি, আপনার কোডটি অনুলিপি / পেস্ট করেছি এবং একটি পরীক্ষা করেছি। এটি আমার পক্ষে নিখুঁতভাবে কাজ করেছে (কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয়নি)। দয়া করে আপনি যা চালাচ্ছেন এবং 4.5 কে টার্গেট করছেন তা আবার পরীক্ষা করে দেখুন
স্টিফেন ক্লিয়ারি

4
আমার লক্ষ্যবস্তু কাঠামো রয়েছে: নেট ফ্রেমওয়ার্ক 4.5 সেট। আমি আপনাকে কী বলব জানি না, এটি অবশ্যই আমার স্থানীয় মেশিনে বাতিল।
ওয়েলেগান

24
এটিই এর <httpRuntime targetFramework="4.5" />সমাধান করেছে, স্পষ্ট করার জন্য ধন্যবাদ।
ওয়েলেগান

4
@ ভিনস: 4.5.৪.১ ঠিকঠাক কাজ করা উচিত। আমি targetFramework4.5 / 5 বা 4.5 সেট করা উচিত কিনা তা নিশ্চিত নই , তবে 4.5.1 এ অ্যাসিঙ্কটি ভাল কাজ করবে কিনা ।
স্টিফেন ক্লিয়ারি

4
আপনি যদি নিজের পরিচালিত হ্যান্ডলারটি লিখে থাকেন? আমি এইচটিটিপি কনটেক্সট নিয়ে আসছি urrent ওয়েবকনফাইগে এই আইটেমগুলি যুক্ত করার পরেও সেখানে = নালীন।
Brain2000

28

যেহেতু @ স্টেফেনক্লিয়ারি সঠিকভাবে নির্দেশ করেছে, আপনার আপনার ওয়েবকনফাইগে এটি দরকার:

<httpRuntime targetFramework="4.5" />

যখন আমি এটির প্রথম সমস্যা সমাধান করছি, আমি উপরেরটির জন্য একটি সমাধান-বিস্তৃত অনুসন্ধান করেছি, এটি আমার সমস্ত ওয়েব প্রকল্পে উপস্থিত রয়েছে এবং তা দ্রুত অপরাধী হিসাবে বরখাস্ত করেছেন confirmed পরিশেষে আমার কাছে এই প্রসঙ্গগুলি অনুসন্ধানের প্রসঙ্গের সাথে দেখার জন্য ঘটেছে:

<!--
  For a description of web.config changes for .NET 4.5 see http://go.microsoft.com/fwlink/?LinkId=235367.

  The following attributes can be set on the <httpRuntime> tag.
    <system.Web>
      <httpRuntime targetFramework="4.5" />
    </system.Web>
-->

দোহ।

পাঠ: আপনি যদি কোনও ওয়েব প্রকল্প ৪.৪-তে উন্নীত করেন তবে আপনাকে এখনও সেটিংটি নিজে হাতে পেতে হবে।


22
আরেকটি গোছা এটি <সংকলনের লক্ষ্য ফ্রেমওয়ার্ক "4.5" /> থেকে আলাদা
অ্যান্ড্রু

3

আমার পরীক্ষাটি কি ত্রুটিযুক্ত, বা আমি এখানে এমন কিছু ওয়েবকনফিগ উপাদান অনুপস্থিত যা এইচটিটিপি কনটেক্সট করে ফেলবে? একটি প্রতীক্ষার পরে সঠিক সমাধানটি ঘটবে?

আপনার পরীক্ষাটি ত্রুটিযুক্ত নয় এবং HttpContext.C اوسطটির অপেক্ষার পরে বাতিল হওয়া উচিত নয় কারণ আপনি যখন অপেক্ষা করেন তখন এএসপি.নেট ওয়েব এপিআই, এটি নিশ্চিত করবে যে অপেক্ষার আগে উপস্থিত কোডটি সঠিক এইচটিটিপি কনটেক্সটটি পাস করেছে যা অপেক্ষা করার আগে উপস্থিত ছিল।


আপনি কি ওয়েবএপিআইয়ের জন্য একই ধারাবাহিকতা থ্রেড সম্পর্কে নিশ্চিত? আমি মোকাবেলা ক্ষেত্রে যেখানে এটি একটি ভিন্ন থ্রেড ছিল।
নাকেরটিও

4
এএসপি.এনইটি যে কোনও থ্রেড পুল থ্রেডে আবার শুরু হবে, তবে সঠিক অনুরোধের প্রসঙ্গে।
স্টিফেন ক্লিয়ারি

4
হ্যাঁ, আপনি ঠিক বলেছেন, থ্রেডটি একই নাও হতে পারে তবে এইচটিটিপি কনটেক্সট urrent বর্তমানের অপেক্ষা করার আগে একই হবে। আমি আমার প্রশ্ন আপডেট করেছি।
দারিন দিমিত্রভ

4
আমার কোডটিতে অপেক্ষা করার পরে এইচটিটিপি কনটেক্সট.কন্টেনটি শূন্য। এবং আমি .net 4.6.1 লক্ষ্য করছি target
ত্রিঞ্চো

4
আমার জন্য এইচটিটিপি কনটেক্সট.কেনরত অপেক্ষা করার ফাংশনের আগেই বাতিল
জোবাডিনিজ

2

আমি সম্প্রতি এই ইস্যুতে দৌড়েছি। যেহেতু স্টিফেন সুস্পষ্টভাবে সেট না করার ইঙ্গিত করেছিলেন লক্ষ্য কাঠামোটি এই সমস্যাটি তৈরি করতে পারে।

আমার ক্ষেত্রে, আমাদের ওয়েব এপিআই সংস্করণ 4.6.2 এ স্থানান্তরিত হয়েছিল তবে রান কমান্ড লক্ষ্য কাঠামোটি ওয়েব কনফিগারেশনে কখনই নির্দিষ্ট করা হয়নি, তাই মূলত এটি <system.web> ট্যাগের মধ্যে অনুপস্থিত ছিল:

ফ্রেমওয়ার্ক সংস্করণ সম্পর্কে আপনার যদি সন্দেহ থাকে তবে আপনি এটি চালিয়ে যাচ্ছেন: আপনার ওয়েব এপিআই পদ্ধতির যে কোনওটিতে নিম্নলিখিত লাইনটি যুক্ত করুন এবং রানটাইমটিতে বর্তমানে কোন ধরণের লোড রয়েছে তা যাচাই করতে একটি ব্রেকপয়েন্ট সেট করুন এবং এটি কোনও উত্তরাধিকার বাস্তবায়ন নয় যাচাই করুন:

আপনার এটি দেখতে হবে (AspNetSynchronizationContext):

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

LegazyAspNetSynchronizationContext এর পরিবর্তে (লক্ষ্য ফ্রেমওয়ার্ক যুক্ত করার আগে যা আমি দেখেছি):

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

আপনি যদি সোর্স কোডে যান ( https: //references Source.microsoft.com/#system.web/LegacyAspNetSynchronizationContext.cs) আপনি দেখতে পাবেন যে এই ইন্টারফেসটির লিগ্যাসি প্রয়োগের ক্ষেত্রে অ্যাসিঙ্ক্রোনাস সমর্থনের অভাব রয়েছে।

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

আমি সমস্যার উত্স খুঁজে পেতে প্রচুর সময় ব্যয় করেছি এবং স্টিফেনের প্রতিক্রিয়া অনেক সহায়তা করেছিল। আশা করি এই উত্তরটি সমস্যাটি সম্পর্কে আরও কিছু তথ্য সরবরাহ করবে।

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