2014-04-11 8 views
28

मेरे पास एक वेब एपीआई प्रोजेक्ट है और सही है मेरी विधियां हमेशा HttpResponseMessage लौटाती हैं।वेब एपीआई सर्वश्रेष्ठ दृष्टिकोण HttpResponseMessage

तो, अगर यह काम करता है या विफल रहता है मैं वापसी:

कोई त्रुटि नहीं:

return Request.CreateResponse(HttpStatusCode.OK,"File was processed."); 

किसी भी त्रुटि या

return Request.CreateResponse(HttpStatusCode.NoContent, "The file has no content or rows to process."); 

असफल जब मैं एक वस्तु मैं तो लौट उपयोग करें:

return Request.CreateResponse(HttpStatusCode.OK, user); 

मुझे पता है कि कैसे मैं अपने एचटीएमएल 5 ग्राहक एक बेहतर समझाया respose पर लौट सकते हैं चाहते हैं, तो मैं लेन-देन के बारे में अधिक जानकारी के लौट सकते हैं, आदि

मुझे लगता है कि संपुटित कर सकते हैं एक कस्टम वर्ग बनाने पर सोच रहा था HttpResponseMessage लेकिन अधिक डेटा भी है।

क्या किसी ने कुछ ऐसा ही लागू किया है?

+0

आपको किसी भी सामग्री का उपयोग किसी HttpStatusCode.NoContent में नहीं करना चाहिए। – kappadoky

+0

आम तौर पर यदि आप 'HttpStatusCode.NoContent' के साथ एक HttpActionResult वापस करते हैं, तो यह आश्चर्यचकित होगा - कोई सामग्री वापस नहीं, भले ही आप ऊपर दिए गए मामले में एक स्ट्रिंग में गुजर रहे हों। एक आश्चर्यजनक बग हो सकता है। उपयोगकर्ता बिगटोन के उत्तर की तरह नीचे। यह विनिर्देश के अनुसार भी समझ में आता है https://httpstatuses.com/204 'हेड फ़ील्ड के बाद पहली खाली पंक्ति द्वारा एक 204 प्रतिक्रिया समाप्त हो जाती है क्योंकि इसमें संदेश निकाय नहीं हो सकता है। – mmcrae

उत्तर

32

हालांकि यह सीधे सवाल का जवाब नहीं दे रहा है, मैं कुछ जानकारी प्रदान करना चाहता था जो मुझे उपयोगी पाया गया। http://weblogs.asp.net/dwahlin/archive/2013/11/11/new-features-in-asp-net-web-api-2-part-i.aspx

HttpResponseMessage IHttpActionResult के साथ कम या ज्यादा प्रतिस्थापित किया गया है। यह उपयोग करने के लिए एक आसान क्लीनर है।

public IHttpActionResult Get() 
{ 
    Object obj = new Object(); 
    if (obj == null) 
     return NotFound(); 
    return Ok(obj); 
} 

फिर आप कस्टम बनाने के लिए encapsulate कर सकते हैं। How to set custom headers when using IHttpActionResult?

मुझे अभी तक एक कस्टम परिणाम लागू करने की आवश्यकता नहीं मिली है, लेकिन जब मैं करता हूं, तो मैं इस मार्ग पर जाउंगा।

शायद यह पुराने व्यक्ति का भी उपयोग करने के समान ही है।

इस पर और विस्तार करने के लिए और थोड़ा और जानकारी प्रदान करें। आप कुछ अनुरोधों के साथ संदेश भी शामिल कर सकते हैं। उदाहरण के लिए।

return BadRequest("Custom Message Here"); 

आप अन्य कई लोगों के साथ ऐसा नहीं कर सकते हैं लेकिन उन सामान्य संदेशों के लिए सहायता करते हैं जिन्हें आप वापस भेजना चाहते हैं।

+2

धन्यवाद, मैं कभी नहीं ड्रेड किए गए HttpResponseMessage को फिर से उपयोग करें – LastTribunal

4

आप अधिक जानकारी प्रदान करने के लिए एक त्रुटि प्रतिक्रिया वापस कर सकते हैं।

public HttpResponseMessage Get() 
{ 
    HttpError myCustomError = new HttpError("The file has no content or rows to process.") { { "CustomErrorCode", 42 } }; 
    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, myCustomError); 
} 

वापसी होगी:

{ 
    "Message": "The file has no content or rows to process.", 
    "CustomErrorCode": 42 
} 

अधिक यहाँ विवरण: http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx

मैं भी http://en.wikipedia.org/wiki/List_of_HTTP_status_codes का उपयोग करने में मदद करने के लिए मुझे यह निर्धारित क्या HTTP स्थिति कोड के लिए।

2

एक महत्वपूर्ण नोट: 204 प्रतिक्रियाओं में सामग्री न डालें! न केवल HTTP विनिर्देश के खिलाफ है, बल्कि यदि आप करते हैं तो .NET वास्तव में अप्रत्याशित शिष्टाचार में व्यवहार कर सकता है।

मैंने गलती से return Request.CreateResponse(HttpStatusCode.NoContent, null); का उपयोग किया और इससे वास्तविक सिरदर्द हो गया; उसी सत्र से भविष्य के अनुरोध प्रतिक्रिया के लिए "null" स्ट्रिंग मान होने के कारण टूट जाएंगे। मुझे लगता है कि .NET हमेशा एक ही सत्र से एपीआई कॉल के लिए प्रतिक्रिया ऑब्जेक्ट का पूर्ण स्पष्ट नहीं करता है।

+0

आम तौर पर यदि आप 'HttpStatusCode.NoContent' के साथ एक HttpActionResult वापस करते हैं, तो यह आश्चर्यचकित होगा - कोई सामग्री नहीं लौटाएगा, भले ही आप उपरोक्त ओपी के मामले में सामग्री में गुजर रहे हों। एक आश्चर्यजनक बग हो सकता है। – mmcrae

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