2012-12-19 11 views
20

मैं एक परियोजना पर काम कर रहा हूं और अपने सभी क्लाइंट साइड ऑपरेशंस के लिए वेब एपीआई पर भारी निर्भर हूं, खाता विवरण अपडेट करें, नए विवरण जोड़े गए हैं, एएसपी.नेट वेब एपी और बैकबोन.जेएससर्वोत्तम अभ्यास: वेब एपीआई नियंत्रकों में त्रुटियों और अपवाद को संभालने के तरीके?

के साथ सबकुछ किया गया है

वर्तमान दृश्य:

चीजों की वर्तमान योजना में, मैं अपने वेब एपीआई नियंत्रकों से एक बूलियन मान लौट रहा हूँ, इंगित करने के लिए कि क्या आपरेशन सफल था या नहीं।

उदाहरण:

[ActionName("UpdateAccountDetails")] 
public bool PostAccountDetails(SomeModel model) 
{ 
    bool updateStatus = _customService.UpdateAccountDetails(model); 
    return updateStatus; 
} 

तो इस कार्रवाई के लिए एक ajax कॉल करने के बाद, मैं सही/गलत और प्रदर्शन त्रुटि या सफलता संदेश के लिए प्रतिक्रिया की जाँच करें।

समस्या:

अब क्या हुआ था मैं अपने कार्रवाई में अपवाद हो रही शुरू कर दिया, और कार्रवाई झूठी लौटने रखा, और त्रुटि संदेश दिखाया गया था। लेकिन मैं क्यों नहीं ढूंढ पाया?

तो मैं सोच रहा था कि मानक एपीआई प्रतिक्रिया संरचना है जो हर कोई निम्नानुसार है?

मैं था शुरू में इस वर्ग के

public class OperationStatus 
{ 
    public bool Result { get; set; } // true/false 
    public string Status { get; set; } // success/failure/warning 
    public List<string> WarningMessages { get; set; } 
    public List<string> ErrorMessages { get; set; } 
    public string OtherDetails { get; set; } 
} 

यह परिवर्तन एक बड़ा परिवर्तन हो सकता है और समय और संसाधन लेने वाली हो जाएगा वापस जाने के लिए प्रत्येक वेब एपीआई कार्रवाई के लिए इस विचार के साथ आने के, तो मैं इसके लिए बेहतर सोचा इस पर दूसरी/तीसरी/चौथी राय है।

कृपया इस पर कुछ विचार डालें।

अद्यतन:

Mark Jones से कुछ little help साथ

, मैं इस

[ActionName("UpdateAccountDetails")] 
public HttpResponseMessage PostAccountDetails(SomeModel model) 
{ 
    bool updateStatus; 
    string errorMessage; 
    try{ 
     updateStatus = _customService.UpdateAccountDetails(model); 
     if(updateStatus) 
     { 
      return Request.CreateResponse(HttpStatusCode.OK); 
     } 
     return Request.CreateResponse(HttpStatusCode.InternalServerError); 
    } 
    catch(Exception exception) 
    { 
     errorMessage = exception.Message; 
     return Request.CreateResponse(HttpStatusCode.InternalServerError, errorMessage); 
    } 

    return updateStatus; 
} 

इस पर कोई विचार के साथ आए हैं?

+0

यह पोस्ट आपको वेबएपीआई के साथ त्रुटि प्रबंधन को लागू करने के बारे में कुछ विचार दे सकता है: http: //blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi .aspx –

+0

आपको केविन और फिलिप के सुझावों को भी नीचे देखना चाहिए। एक अपवाद फ़िल्टर को कार्यान्वित करना एक अच्छा विचार है और जब कोई त्रुटि होती है तो आपको एक HttpResponseException फेंकना चाहिए ताकि आपको अपने क्रिया हस्ताक्षर पर रिटर्न प्रकार को बदलने की आवश्यकता न हो। –

उत्तर

26

आपको नियंत्रक की कार्रवाई में प्रयास/पकड़ का उपयोग करने से बचना चाहिए।

आपकी समस्या को संभालने के कई तरीके हैं।

public class ExceptionAttribute : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext context) 
    { 
     Debug.WriteLine(context.Exception); 

     throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError) 
     { 
      Content = new StringContent("An error occurred!"), 
      ReasonPhrase = "Deadly Exception" 
     }); 
    } 
} 

तो फिर तुम सिर्फ [ExceptionAttribute] साथ अपनी कार्रवाई को सजाने कर सकते हैं: सरल और साफ समाधान शायद अपवाद हैं, की तर्ज पर कुछ को संभालने के लिए एक ActionFilter उपयोग करने के लिए किया जाएगा। बेशक आप इसे विभिन्न प्रकार के अपवादों के लिए अलग-अलग व्यवहार करने के लिए बढ़ा सकते हैं - व्यवसाय अपवाद, डेटा अपवाद, आईओ अपवाद और इसी तरह, और इसके आधार पर विभिन्न स्थिति कोड और फीडबैक भी वापस कर सकते हैं।

मैं सुझाव है कि आप फ्रेड्रिक Normen द्वारा एक उत्कृष्ट लेख पढ़ें - "ASP.NET वेब एपीआई एक्सेप्शन हैंडलिंग"http://weblogs.asp.net/fredriknormen/archive/2012/06/11/asp-net-web-api-exception-handling.aspx

वह वेब एपीआई के लिए अपवाद हैंडलिंग तकनीकों का एक शानदार अवलोकन प्रदान करता है।

+0

फ्रेडरिक नॉर्मन के लेख के बारे में पोस्ट करने के लिए उत्कृष्ट अनुशंसा और धन्यवाद! – seebiscuit

4
इसके बजाय लौटने का

एक HttpResponseMessage मैं एपीआई ही है रखना होगा और बस फेंक एक HttpResponseException जब आप एक अपवाद को पकड़ने के। कुछ इस तरह:

throw new HttpResponseException(
    new HttpResponseMessage(HttpStatusCode.InternalServerError) 
     { ReasonPhrase = errorMessage }); 

इस तरह आप अपने एपीआई की परिभाषा में परिवर्तन नहीं करते हैं और यह है, साथ ही अपने GET कार्यों के साथ काम करेंगे जहां आप किसी वस्तु है कि धारावाहिक जा करने के लिए वापस जाएँ। यदि आप अनुरोध को भेजने के लिए JQuery AJAX विधि का उपयोग कर रहे हैं तो त्रुटि हैंडलर इसे पकड़ लेगा और आप त्रुटि टेक्स्ट पैरामीटर में टेक्स्ट संदेश पुनर्प्राप्त कर सकते हैं और तदनुसार इसे संभाल सकते हैं।

संबंधित मुद्दे