এএসপি.নেট ওয়েব এপিআই-এ সমস্ত অনাহত ব্যতিক্রম ধরা catch


113

আমি কীভাবে এএসপি.নেট ওয়েব এপিতে ঘটে যাওয়া সমস্ত অপ্রয়োজনীয় ব্যতিক্রমগুলি ধরব যাতে আমি তাদের লগইন করতে পারি?

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

  • তৈরি এবং নিবন্ধন করুন ExceptionHandlingAttribute
  • একটি Application_Errorপদ্ধতি প্রয়োগ করুনGlobal.asax.cs
  • সাবস্ক্রাইব করুন AppDomain.CurrentDomain.UnhandledException
  • সাবস্ক্রাইব করুন TaskScheduler.UnobservedTaskException

ExceptionHandlingAttributeসফলভাবে ব্যতিক্রম যে নিয়ামক কর্ম পদ্ধতি ও কর্ম ফিল্টার মধ্যে নিক্ষিপ্ত হয়, কিন্তু অন্যান্য ব্যতিক্রম ঘাঁটা নয়, উদাহরণস্বরূপ হ্যান্ডলগুলি:

  • IQueryableকোনও অ্যাকশন পদ্ধতির দ্বারা প্রত্যাবর্তন কার্যকর হলে ব্যর্থ হয় thrown
  • বার্তা হ্যান্ডলারের দ্বারা ছোঁড়া ব্যতিক্রম (যেমন HttpConfiguration.MessageHandlers)
  • একটি নিয়ামক উদাহরণ তৈরি করার সময় নিক্ষিপ্ত ব্যতিক্রমগুলি

মূলত, যদি কোনও ব্যতিক্রম ক্লায়েন্টের কাছে 500 অভ্যন্তরীণ সার্ভার ত্রুটির কারণ হয়ে থাকে, আমি চাই এটি লগড। বাস্তবায়নকারী Application_Errorভাল ওয়েব ফর্ম এবং MVC এই কাজ করেছেন - আমি ওয়েব এপিআই কি ব্যবহার করতে পারি?


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

স্বাস্থ্য নিরীক্ষণ আমার এমভিসি পাইপলাইন ব্যতিক্রমগুলি ধরে, তবে আমার ওয়েব অপি পাইপলাইন ব্যতিক্রম নয়।
জো ডেলি

ধন্যবাদ - আমি কেন আমার কনস্ট্রাক্টর / নির্ভরতা ইনজেকশন ইস্যুতে লগ করতে পারি না তা বুঝতে আমার কিছুটা সময় লেগেছে, যেখানে আমি ভেবেছিলাম যে আমি ইতিমধ্যে ওয়েবএপিআই লগিংটি বাছাই করেছি ...
ওভারফ্লিউ

উত্তর:


156

ওয়েবএপিআই ২.১ এর মাধ্যমে এটি এখন সম্ভব হয়েছে ( নতুন কী দেখুন ):

আইসেক্সেপশনলগার এর এক বা একাধিক বাস্তবায়ন তৈরি করুন। উদাহরণ স্বরূপ:

public class TraceExceptionLogger : ExceptionLogger
{
    public override void Log(ExceptionLoggerContext context)
    {
        Trace.TraceError(context.ExceptionContext.Exception.ToString());
    }
}

তারপরে এমন কোনও কনফিগার কলব্যাকের অভ্যন্তরে আপনার অ্যাপ্লিকেশনটির এইচটিটিপি কনফিগারেশন দিয়ে নিবন্ধন করুন:

config.Services.Add(typeof(IExceptionLogger), new TraceExceptionLogger());

বা সরাসরি:

GlobalConfiguration.Configuration.Services.Add(typeof(IExceptionLogger), new TraceExceptionLogger());

7
@NeilBarnwell হ্যাঁ, ওয়েব এপিআই 2.1 System.Web.Http সমাবেশ সংস্করণে অনুরূপ 5.1.0 । সুতরাং এখানে বর্ণিত সমাধানটি ব্যবহার করার জন্য আপনার এই সংস্করণ বা তার বেশি প্রয়োজন। দেখুন nuget প্যাকেজ সংস্করণ
decates

2
কয়েকটি 500 টি ত্রুটি এখনও এর দ্বারা ধরা পড়ে না, যেমন। এইচটিপিএক্সেপশন - রিমোট হোস্ট সংযোগটি বন্ধ করে দিয়েছে। ওয়েব এপিআই প্রসেসিংয়ের বাইরের ত্রুটিগুলি পরিচালনা করতে এখনও বিশ্বব্যাপী.অ্যাসাক্স অ্যাপ্লিকেশন_এররের কোনও জায়গা আছে?
অ্যাভনার

11
আমি পছন্দ করি যে এমএসডিএন-তে অফিসিয়াল ডকোটি কতটা বিশদ রয়েছে এবং 99% বিকাশকারীরা সত্যিই যা চান তা লগ ত্রুটির জন্য কোডের 8 টি লাইন।
রক্লান

20

ইউভালের উত্তরটি লিঙ্কযুক্ত পৃষ্ঠায় উল্লিখিত হিসাবে লগিংয়ের জন্য নয়, ওয়েব এপিআই দ্বারা ধরা অনাহীন ব্যতিক্রমগুলির প্রতিক্রিয়াগুলি কাস্টমাইজ করার জন্য । বিস্তারিত জানার জন্য পৃষ্ঠায় কখন ব্যবহার করবেন বিভাগটি পড়ুন। লগার সবসময় বলা হয় তবে হ্যান্ডলারটি তখনই ডাকা হয় যখন কোনও প্রতিক্রিয়া প্রেরণ করা যায়। সংক্ষেপে, লগ করতে লগার এবং প্রতিক্রিয়াটি কাস্টমাইজ করতে হ্যান্ডলারটি ব্যবহার করুন ।

প্রসঙ্গক্রমে, আমি সমাবেশ v5.2.3 ব্যবহার করছি এবং ExceptionHandlerবর্গ নেই HandleCoreপদ্ধতি। সমান, আমি মনে করি Handle। তবে, কেবল সাবক্লাসিং ExceptionHandler(যুভালের উত্তরে) কাজ করে না। আমার ক্ষেত্রে, আমাকে IExceptionHandlerনিম্নলিখিত হিসাবে প্রয়োগ করতে হবে ।

internal class OopsExceptionHandler : IExceptionHandler
{
    private readonly IExceptionHandler _innerHandler;

    public OopsExceptionHandler (IExceptionHandler innerHandler)
    {
        if (innerHandler == null)
            throw new ArgumentNullException(nameof(innerHandler));

        _innerHandler = innerHandler;
    }

    public IExceptionHandler InnerHandler
    {
        get { return _innerHandler; }
    }

    public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
    {
        Handle(context);

        return Task.FromResult<object>(null);
    }

    public void Handle(ExceptionHandlerContext context)
    {
        // Create your own custom result here...
        // In dev, you might want to null out the result
        // to display the YSOD.
        // context.Result = null;
        context.Result = new InternalServerErrorResult(context.Request);
    }
}

মনে রাখবেন, লগারের বিপরীতে, আপনি ডিফল্ট হ্যান্ডলারটি যোগ না করে প্রতিস্থাপন করে আপনার হ্যান্ডলারটি নিবন্ধভুক্ত করেন।

config.Services.Replace(typeof(IExceptionHandler),
    new OopsExceptionHandler(config.Services.GetExceptionHandler()));

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

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

18

আমার নিজের প্রশ্নের উত্তর দিতে, এটি সম্ভব নয়!

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

https://aspnetwebstack.codeplex.com/workitem/1001

আপনি যদি সম্মত হন তবে সেই লিঙ্কটিতে যান এবং তার পক্ষে ভোট দিন!

ইতিমধ্যে, চমৎকার নিবন্ধ ASP.NET ওয়েব এপিআই ব্যতিক্রম হ্যান্ডলিং কয়েকটি ভিন্ন বিভাগের ত্রুটি ধরার কয়েকটি ভিন্ন উপায় দেখায়। এটি যতটা হওয়া উচিত তার চেয়ে জটিল, এবং এটি সমস্ত ইন্টিরিয়াল সার্ভার ত্রুটিগুলি ধরতে পারে না , তবে এটি আজ উপলব্ধ সেরা পদ্ধতির।

আপডেট: গ্লোবাল ত্রুটি হ্যান্ডলিং এখন বাস্তবায়িত এবং রাত্রে বিল্ডগুলিতে উপলব্ধ! এটি ASP.NET MVC v5.1 এ প্রকাশিত হবে। এটি কীভাবে কাজ করবে তা এখানে: https://aspnetwebstack.codeplex.com/wikipage?title=Global%20Error%20 হ্যান্ডলিং


ওয়েব এপি-র পরিবর্তে অজ্যাক্স কলগুলির জন্য নিয়ামক ব্যবহার করার কারণ বলে মনে হচ্ছে .. সীমানা ইতিমধ্যে ঝাপসা হয়ে গেছে .. যদিও যদি এলএএমএইচ এটি ক্যাপচার করতে সক্ষম হয় তবে সম্ভবত একটি উপায় আছে
সোনিক সোল

4
ওয়েব এপিআই ২.১-এ এখন বৈশ্বিক ত্রুটি হ্যান্ডলিং যুক্ত করা হয়েছে। আরও তথ্যের জন্য আমার উত্তর দেখুন।
decates

10

আপনি IExceptionHandlerইন্টারফেস (বা ExceptionHandlerবেস শ্রেণীর উত্তরাধিকারী ) প্রয়োগ করে একটি বৈশ্বিক ব্যতিক্রম হ্যান্ডলারও তৈরি করতে পারেন । সমস্ত নিবন্ধিত হওয়ার পরে এটি কার্যকর করা চেইনে সর্বশেষে ডাকা হবে IExceptionLogger:

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

public class OopsExceptionHandler : ExceptionHandler
{
    public override void HandleCore(ExceptionHandlerContext context)
    {
        context.Result = new TextPlainErrorResult
        {
            Request = context.ExceptionContext.Request,
            Content = "Oops! Sorry! Something went wrong."        
        };
    }

    private class TextPlainErrorResult : IHttpActionResult
    {
        public HttpRequestMessage Request { get; set; }

        public string Content { get; set; }

        public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
        {
            HttpResponseMessage response = 
                             new HttpResponseMessage(HttpStatusCode.InternalServerError);
            response.Content = new StringContent(Content);
            response.RequestMessage = Request;
            return Task.FromResult(response);
        }
    }
}

আরো বিষয়ে এখানে


শুধু কৌতূহলী, এই নিবন্ধিত হয় কোথায়?
ThunD3eR

-1

আপনার কাছে বিদ্যমান ট্রাই-ক্যাচ ব্লক থাকতে পারে যা আপনি অবগত নন।

আমি ভেবেছিলাম আমার নতুন global.asax.Application_Errorপদ্ধতিটি ধারাবাহিকভাবে আমাদের উত্তরাধিকারের কোডটিতে অবিচ্ছিন্ন ব্যতিক্রমগুলির জন্য ডাকা হচ্ছে না।

তারপরে আমি কল স্ট্যাকের মাঝখানে কয়েকটি ট্রাই-ক্যাচ ব্লক পেয়েছি যা রেসপন্স বলে called ঐটা এটা ছিল. স্ক্রিনে পাঠ্যটি ছুঁড়ে ফেলেছে তবে ব্যতিক্রম পাথরটি মারা গেছে।

সুতরাং ব্যতিক্রমগুলি পরিচালনা করা হচ্ছিল, তবে হ্যান্ডলিংটি কার্যকর কিছু করছে না। প্রত্যাশিতভাবে অ্যাপ্লিকেশন_রর পদ্ধতিতে প্রচারিত ব্যতিক্রমগুলি আমি একবার চেষ্টা করে ফেললে blocks

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