HttpResponseMessage ऑब्जेक्ट में सामग्री डालें?


180

कई महीने पहले, Microsoft ने HttpResponseMessage वर्ग को बदलने का फैसला किया। इससे पहले, आप बस एक डेटा प्रकार को कंस्ट्रक्टर में पास कर सकते हैं, और फिर उस डेटा के साथ संदेश वापस कर सकते हैं, लेकिन अब नहीं।

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

किसी को भी इस मुद्दे से निपटने के लिए कैसे पता है? बहुत बहुत धन्यवाद।

जवाबों:


216

एक स्ट्रिंग के लिए विशेष रूप से, तेज तरीका StringContent कंस्ट्रक्टर का उपयोग करना है

response.Content = new StringContent("Your response text");

अन्य सामान्य परिदृश्यों के लिए अतिरिक्त HttpContent श्रेणी के वंशज हैं।


StringContent (जैसे JSON, XML आदि) के अपने स्वयं के व्युत्पन्न प्रकार बनाने के लिए नीचे मेरी पोस्ट देखें।
बाईटदेव

135

आपको Request.CreateResponse का उपयोग करके प्रतिक्रिया तैयार करनी चाहिए :

HttpResponseMessage response =  Request.CreateResponse(HttpStatusCode.BadRequest, "Error message");

आप ऑब्जेक्ट्स को सिर्फ CreateResponse तक नहीं भेज सकते हैं और यह अनुरोध के एक्सेप्ट हेडर के आधार पर उन्हें क्रमबद्ध करेगा। यह आपको मैन्युअल रूप से फॉर्मेटर चुनने से बचाता है।


यह स्वचालित रूप से सामग्री प्रकारों के साथ काम करता है ताकि आप बिना अतिरिक्त कोड के xml / json कर सकें

मुझे लगता है CreateErrorResponse()कि प्रतिक्रिया सही होने पर कॉल करना अधिक सही होगा , क्योंकि यह इस उत्तर के उदाहरण में है। this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "message", exception); अगर मैं उपयोग कर रहा हूं, तो मेरी कोशिश-कैच के अंदर: और, यह सही उत्तर है यदि आप कॉल करने वाले हेडर का सम्मान करने के बारे में चिंतित हैं, बिना अतिरिक्त शेनैनिग के। (और आप WebAPI का उपयोग कर रहे हैं)
JMD

2
@FlorinDumitrescu उनकी बात यह थी कि जब आप वारिस करते हैं तो यह केवल काम करता है ApiController। यदि आप Controllerइसके बजाय केवल विरासत में हैं, तो यह काम नहीं करता है, और आपको इसे स्वयं बनाना होगा: HttpResponseMessage msg = new HttpResponseMessage(); msg.Content = new StringContent("hi"); msg.StatusCode = HttpStatusCode.OK;
vapcguy

64

स्पष्ट रूप से इसे करने का नया तरीका यहां विस्तृत है:

http://aspnetwebstack.codeplex.com/discussions/350492

हेनरिक को उद्धृत करने के लिए,

HttpResponseMessage response = new HttpResponseMessage();

response.Content = new ObjectContent<T>(T, myFormatter, "application/some-format");

तो मूल रूप से, व्यक्ति को एक ऑब्जेक्टकंटेंट प्रकार बनाना होगा, जिसे जाहिरा तौर पर एक HttpContent ऑब्जेक्ट के रूप में वापस किया जा सकता है।


31
क्या है MyFormatter
ग्रेग जेड।

1
@ user1760329 यह एक new JsonMediaTypeFormatter();या आपके प्रारूप के आधार पर समान होगा
जॉन

1
ObjectContentWCF
Medet Tleukabiluly

2
मैं इसे "इसे करने के नए तरीके" के रूप में अर्हता प्राप्त नहीं करूंगा - वह लेख जिसे आप संदर्भ में सूचीबद्ध करते हैं, आप इसे उस विकल्प के रूप में सूचीबद्ध करते हैं जिसे आप "मीडिया-प्रकार] के पूर्ण नियंत्रण के लिए उपयोग करना चाहते हैं"
बर्न

साभार @praetor यह वास्तव में मेरे लिए मददगार रहा है
SO यूजर

53

सबसे आसान सिंगल-लाइन समाधान का उपयोग करना है

return new HttpResponseMessage( HttpStatusCode.OK ) {Content =  new StringContent( "Your message here" ) };

क्रमबद्ध JSON सामग्री के लिए:

return new HttpResponseMessage( HttpStatusCode.OK ) {Content =  new StringContent( SerializedString, System.Text.Encoding.UTF8, "application/json" ) };

यह मेरे लिए काम नहीं किया क्योंकि IHttpActionResult को ResponseMessageResult के रिटर्न प्रकार की आवश्यकता है। मेरे साथ क्या हुआ, इसके लिए मेरा जवाब नीचे देखें। यह भी ध्यान दें, मैंने nashawn के JsonContent (StringContent बेस क्लास से प्राप्त) में कारक किया।
एडम कॉक्स

1
बस HttpResponseMessage को फिर से लपेटें: नया ResponseMessageResult (नया HttpResponseMessage (HttpStatusCode.OK) लौटाएँ) {नया StringContent (आपका संदेश यहाँ ")}); :)
साइमन मैट्स

41

किसी भी T ऑब्जेक्ट के लिए आप कर सकते हैं:

return Request.CreateResponse<T>(HttpStatusCode.OK, Tobject);

5
सिवाय Requestकेवल एक CreateResponseविधि के साथ उपलब्ध है यदि आप विरासत में हैं ApiController। यह उपयोग करने पर काम नहीं करेगा Controller
vapcguy

15

आप अपनी विशिष्ट सामग्री प्रकार बना सकते हैं। उदाहरण के लिए Json सामग्री के लिए एक और Xml सामग्री के लिए एक (तब बस उन्हें HttpResponseMessage.Content पर असाइन करें):

public class JsonContent : StringContent
{
    public JsonContent(string content)
        : this(content, Encoding.UTF8)
    {
    }

    public JsonContent(string content, Encoding encoding)
        : base(content, encoding, "application/json")
    {
    }
}

public class XmlContent : StringContent
{
    public XmlContent(string content) 
        : this(content, Encoding.UTF8)
    {
    }

    public XmlContent(string content, Encoding encoding)
        : base(content, encoding, "application/xml")
    {
    }
}

बहुत साफ और स्वच्छ कार्यान्वयन।
सैम

3

साइमन मैट्स के जवाब से प्रेरित होकर, मुझे IHttpActionResult को संतुष्ट करने की आवश्यकता थी, जो रिस्पोंसमैसजेस.उत्तर की वापसी प्रकार की आवश्यकता है। इसके अलावा nashwn के JsonContent का उपयोग करते हुए, मैं के साथ समाप्त हुआ ...

        return new System.Web.Http.Results.ResponseMessageResult(
            new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK)
            {
                Content = new JsonContent(JsonConvert.SerializeObject(contact, Formatting.Indented))
            });

JsonContent के लिए nashwn का जवाब देखें।


स्ट्रिंग इंटरपोलेशन अनावश्यक लगता है
इगोर पश्चुक 20

0

इसमें कोई शक नहीं कि आप सही फ्लोरीन हैं। मैं इस परियोजना पर काम कर रहा था, और पाया कि इस कोड का टुकड़ा:

product = await response.Content.ReadAsAsync<Product>();

के साथ प्रतिस्थापित किया जा सकता है:

response.Content = new StringContent(string product);

1
यह उत्तर प्रश्न के लिए प्रासंगिक नहीं लगता है और यह नहीं दर्शाता है कि किसी वस्तु (उत्पाद) से स्ट्रिंग पर कैसे जाएं
mageos
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.