c# - HttpResponseMessage लौटने के लिए वेब एपीआई सर्वश्रेष्ठ दृष्टिकोण




asp.net-mvc json asp.net-web-api (4)

यद्यपि यह सीधे सवाल का जवाब नहीं दे रहा है, लेकिन मैं कुछ जानकारी प्रदान करना चाहता था जो मुझे उपयोगी पाया गया। 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 कर सकते हैं। IHttpActionResult का उपयोग करते समय कस्टम शीर्षलेख कैसे सेट करें?

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

यह संभवतः पुराने का उपयोग करने के समान ही है।

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

return BadRequest("Custom Message Here");

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

मेरे पास एक वेब एपीआई प्रोजेक्ट है और मेरी विधियां हमेशा 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 क्लाइंट को बेहतर encapsulated respose कैसे वापस कर सकता हूं, इसलिए मैं लेनदेन के बारे में अधिक जानकारी वापस कर सकता हूं।

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

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


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

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


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

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 स्थिति कोड वापस लौटने के लिए क्या है।


टोनी के विस्तार का विस्तार यहां दिया गया है ... :-)

इकाई फ्रेमवर्क 4.x के लिए, यदि आप कुंजी फ़ील्ड का नाम और मान प्राप्त करना चाहते हैं ताकि आप जान सकें कि कौन सी इकाई इंस्टेंस (डीबी रिकॉर्ड) में समस्या है, तो आप निम्न जोड़ सकते हैं। यह आपके DbContext ऑब्जेक्ट से अधिक शक्तिशाली ऑब्जेक्ट कॉन्टेक्स्ट क्लास सदस्यों तक पहुंच प्रदान करता है।

// Get the key field name & value.
// This assumes your DbContext object is "_context", and that it is a single part key.
var e = ((IObjectContextAdapter)_context).ObjectContext.ObjectStateManager.GetObjectStateEntry(validationErrors.Entry.Entity);
string key = e.EntityKey.EntityKeyValues[0].Key;
string val = e.EntityKey.EntityKeyValues[0].Value;






c# asp.net-mvc json asp.net-web-api httpresponse