2012-08-24 21 views
6

से वापस अपवाद की रिपोर्ट नहीं करता है, मैं अपने एमवीसी 4 वेब एपीआई को कॉल करने के लिए HttpClient का उपयोग कर रहा हूं। मेरे वेब एपीआई कॉल में, यह एक डोमेन ऑब्जेक्ट देता है। यदि कुछ भी गलत हो जाता है, तो एक अनुकूलित संदेश के साथ, HttpResponseException सर्वर पर फेंक दिया जाएगा।एचटीपी क्लाइंट वेब एपीआई

[System.Web.Http.HttpGet] 
    public Person Person(string loginName) 
    { 
     Person person = _profileRepository.GetPersonByEmail(loginName); 
     if (person == null) 
      throw new HttpResponseException(
     Request.CreateResponse(HttpStatusCode.NotFound, 
       "Person not found by this id: " + id.ToString())); 

     return person; 
    } 

मैं आईई एफ 12 का उपयोग कर प्रतिक्रिया शरीर में अनुकूलित त्रुटि संदेश देख सकता हूं। हालांकि जब मैं इसे HttpClient का उपयोग करके कॉल करता हूं, तो मुझे अनुकूलित त्रुटि संदेश नहीं मिलता है, केवल http कोड। 500 कारणों के लिए "रेज़नफेस" हमेशा 404 के लिए "नहीं मिला" या "आंतरिक सर्वर त्रुटि" है।

कोई भी विचार? सामान्य रिटर्न प्रकार को मेरा डोमेन ऑब्जेक्ट रखने के दौरान, मैं वेब एपीआई से कस्टम त्रुटि संदेश कैसे भेजूं?

+0

आप किस वेब सर्वर का उपयोग कर रहे हैं, आईआईएस या एएसपी.नेट वेब सर्वर? –

+0

मैं एक विन 2008 आर 2 पर आईआईएस का उपयोग कर रहा हूं। दोबारा, यह ठीक है जब मैं इसे ब्राउज़र का उपयोग करके कॉल करता हूं। – Calvin

उत्तर

14

(बेहतर प्रारूपण के लिए यहाँ मेरा उत्तर लाना)

हाँ मैं इसे देखा था, लेकिन HttpResponseMessage एक शरीर संपत्ति नहीं है। मैंने इसे स्वयं समझ लिया: response.Content.ReadAsStringAsync().Result;। नमूना कोड:

public T GetService<T>(string requestUri) 
{ 
    HttpResponseMessage response = _client.GetAsync(requestUri).Result; 
    if(response.IsSuccessStatusCode) 
    { 
     return response.Content.ReadAsAsync<T>().Result; 
    } 
    else 
    { 
     string msg = response.Content.ReadAsStringAsync().Result; 
      throw new Exception(msg); 
    } 
} 
+4

आपको 'रीडएएसएसिंक ' से सीधे 'परिणाम' का आह्वान करने से सावधान रहना चाहिए क्योंकि इससे अंतःस्थापित थ्रेडिंग समस्याएं हो सकती हैं। इसके बजाए, कोशिश करें: 'var contentTask = response.Content.ReadAsAsync (); 'ContentTask.Wait();' और फिर 'सामग्री वापस करें Task.Result;' –

+0

टिप के लिए धन्यवाद! – Calvin

+2

@ सिक्सतो: क्या आप थ्रेडिंग मुद्दों का वर्णन कर सकते हैं? [परिणाम] (http://msdn.microsoft.com/en-us/library/vstudio/dd321468 (v = vs.110) .aspx) दस्तावेज़ कहते हैं, "इस संपत्ति के लिए पहुंच प्राप्तकर्ता यह सुनिश्चित करता है कि एसिंक्रोनस ऑपरेशन पूर्ण हो गया है लौटने से पहले। " ऐसा लगता है कि 'प्रतीक्षा' में कॉल किया गया है। –

0

कस्टम त्रुटि संदेश प्रतिक्रिया के 'शरीर' में होगा।

+0

हां मैंने इसे देखा लेकिन HttpResponseMessage में शरीर की संपत्ति नहीं है। मैंने इसे अपने आप से बाहर निकाला: 'प्रतिक्रिया। सामग्री। रीडएएसस्ट्रिंगएसिंक() परिणाम; '। नमूना कोड: सार्वजनिक टी GetService (स्ट्रिंग अनुरोध यूआरआई) { HttpResponseMessage प्रतिक्रिया = _client.GetAsync (requestUri) .Result; यदि (प्रतिक्रिया। IsSuccessStatusCode) { वापसी प्रतिक्रिया। सामग्री। ReadAsAsync ()। Reses; } अन्य { स्ट्रिंग msg = प्रतिक्रिया। सामग्री। रीडएएसस्ट्रिंगएसिंक() परिणाम; नया अपवाद फेंक दें (msg); } } – Calvin

+0

वास्तव में शरीर द्वारा, मेरा मतलब प्रतिक्रिया की सामग्री थी। –

1

मैं तर्क में से कुछ पर निर्भर करता है जब एक प्रतिक्रिया से अपवाद हथियाने।

यह यह बहुत आसान अपवाद, भीतरी अपवाद, भीतरी अपवाद :), आदि

public static class HttpResponseMessageExtension 
{ 
    public static async Task<ExceptionResponse> ExceptionResponse(this HttpResponseMessage httpResponseMessage) 
    { 
     string responseContent = await httpResponseMessage.Content.ReadAsStringAsync(); 
     ExceptionResponse exceptionResponse = JsonConvert.DeserializeObject<ExceptionResponse>(responseContent); 
     return exceptionResponse; 
    } 
} 

public class ExceptionResponse 
{ 
    public string Message { get; set; } 
    public string ExceptionMessage { get; set; } 
    public string ExceptionType { get; set; } 
    public string StackTrace { get; set; } 
    public ExceptionResponse InnerException { get; set; } 
} 

पूरी चर्चा के लिए निकालने के लिए this blog post देखने में आता है।

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