2012-04-26 20 views
9

के लिए अलग-अलग रिटर्न प्रकार मैं एएसपी.नेट एमवीसी 4 वेब एपीआई का उपयोग कर HTTP पर वास्तव में रीस्टफुल वेब सेवाओं को लिखने का प्रयास कर रहा हूं।एएसपी.नेट वेब एपीआई

मेरे पास वर्तमान स्थिति चुनौती है जो मेरे स्टेटस कोड के आधार पर अलग-अलग रिटर्न प्रकार (इकाई-बॉडी) को वापस करना है।

उदाहरण के लिए, संसाधन हैमर के लिए मैं एक नेट मॉडल वर्ग "हैमर", और एक HammerController है:

namespace Awesomeness 
{ 
    public class HammerController : ApiController 
    { 
     public Hammer Get(int id) 
     { 
     } 
... 

तो आईडी मौजूद नहीं है (404) या अलग प्राधिकरण (401) की आवश्यकता है, मैं आसानी से वापसी को शॉर्टकट कर सकता हूं और मैन्युअल रूप से स्टेटस कोड और किसी भी अन्य सामग्री को सेट कर सकता हूं, जो कि अच्छा है। हालांकि, कई गैर-2xx स्थितियों में, मैं हथौड़ा संसाधन प्रतिनिधित्व की तुलना में एक अलग इकाई-शरीर को वापस करना चाहता हूं। मैं इसे आसानी से मैन्युअल रूप से कर सकता हूं, लेकिन मैं अनुरोध हेडर के आधार पर एएसपी.नेट एमवीसी 4 वेब एपीआई ऑटोमैटिक सीरियलाइजेशन और एक्सएमएल या जेएसओएन से deserialization का लाभ लेना चाहता हूं।

तो मेरा मुख्य प्रश्न यह है: क्या मैं अलग-अलग रिटर्न प्रकार लौटाते समय एएसपी.नेट एमवीसी 4 वेब एपीआई के ऑटोमैजिक सीरियलाइजेशन का लाभ उठा सकता हूं?

कुछ संभावित दृष्टिकोण मैं बारे में सोचा है कर रहे हैं:

  1. नियंत्रक विधि मुख्य संसाधन प्रकार वापसी है, लेकिन शॉर्ट सर्किट HttpContext.Current.Response और किसी भी तरह के साथ वापसी automagic क्रमबद्धता (पसंदीदा) में हुक।

  2. क्या मेरा मॉडल वर्ग सी यूनियन की तरह अधिक है जहां यह इस प्रकार या उस प्रकार का प्रतिनिधित्व करता है और इसे सामान्य रिटर्न प्रक्रिया के हिस्से के रूप में क्रमबद्ध करने देता है (और केवल स्थिति कोड और किसी भी प्रतिक्रिया शीर्षकों को ओवरराइड करें)। यहां तक ​​कि यदि मुझे लगता है कि यह कैसे करना है, मुझे लगता है कि यह अभी भी बहुत हैकी होने वाला है।

संपादित अप्रैल 27 2012: मैं एक HttpResponseException इस तरह फेंक कर सकते हैं:

HttpResponseMessage response = new HttpResponseMessage(statusCode); 
if (!string.IsNullOrWhiteSpace(text)) 
{ 
    response.Content = new StringContent(text); 
} 
throw new HttpResponseException(response); 

... लेकिन अब मैं यह पता लगाने की ऑटो जादू क्रमबद्धता में हुक और स्थापित करने के लिए कैसे की जरूरत है response.ContentAccept हेडर वार्तालाप प्रतिनिधित्व के लिए।

उत्तर

15

मैंने this other question पर प्राप्त उत्तर से इस प्रश्न का स्पष्ट उत्तर प्राप्त किया।

यदि मैं अपना रिटर्न वैल्यू HttpResponseMessage करता हूं, तो मैं new HttpResponseMessage() लौटकर मुझे जो भी स्थिति या सामग्री वापस कर सकता हूं उसे वापस कर सकता हूं।

संपादित 2012/05/10: @DarrelMiller से इनपुट के लिए धन्यवाद, पदावनत HttpResponseMessage<T> हटा दिया और HttpRequestMessage.CreateResponse<T>() विस्तार विधि करने के लिए कॉल के साथ बदल दिया। नोट: यह एक्सटेंशन विधि एमवीसी 4/वेबएपीआई बीटा में उपलब्ध नहीं है। आपको build from source की आवश्यकता है या nightly build प्राप्त करें।

oversimplified उदाहरण:

public HttpResponseMessage Post(MyResource myResource) 
{ 
    ... 
    if (goodStuff) 
    { 
     return ControllerContext.Request.CreateResponse(HttpStatusCode.Created, myNewResource); 
    } 
    else if (badStuff) 
    { 
     return ControllerContext.Request.CreateResponse(HttpStatusCode.BadRequest, badRequest); 
    } 
    else 
    { 
     return new HttpResponseMessage(HttpStatusCode.InternalServerError); 
    } 
} 
+0

संपादित करें के लिए धन्यवाद। मैं अपने स्थापित बीटा के साथ काम करने के लिए HttpResponseMessage प्राप्त करने के लिए पूरे दिन देख रहा था ... – Max

+0

क्यों HttpResponseMessage को 'प्रतिक्रिया बनाने' के लिए अधिभार नहीं है? –

+2

@ सिमोन_वेवर - मैं अनुमान लगा रहा हूं क्योंकि आप HttpRequestMessage के जवाब में एक HttpResponseMessage बना रहे हैं, इसलिए यह प्रतिक्रिया देने के संदर्भ में संदर्भ के अनुरोध का उपयोग करता है। – MikeJansen

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