এইচটিটিপিআরস্পোনমেসেজ অবজেক্টে কন্টেন্ট রেখেছেন?


180

কয়েক মাস আগে মাইক্রোসফ্ট এইচটিপিআরএসপোনসম্যাসেজ ক্লাস পরিবর্তন করার সিদ্ধান্ত নিয়েছে। আগে, আপনি কেবল কনস্ট্রাক্টরে কোনও ডেটা টাইপ করতে পারতেন এবং তারপরে সেই ডেটা দিয়ে বার্তাটি ফেরত দিতে পারতেন, তবে আর নয়।

এখন, বার্তার সামগ্রীটি সেট করার জন্য আপনার সামগ্রী সামগ্রীটি ব্যবহার করতে হবে। সমস্যাটি হ'ল এটি এইচটিটিপি কনটেন্ট টাইপের, এবং আমি স্ট্রিং রূপান্তর করার কোনও উপায় খুঁজে পাচ্ছি না, উদাহরণস্বরূপ, এইচটিটিপি কনটেন্টে।

কেউ কি এই সমস্যাটি মোকাবেলা করতে জানেন? অনেক ধন্যবাদ.

উত্তর:


216

একটি স্ট্রিং বিশেষভাবে জন্য দ্রুততম উপায়ে ব্যবহার করা StringContent কন্সট্রাকটর

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

অন্যান্য সাধারণ পরিস্থিতিগুলির জন্য এখানে বেশ কয়েকটি অতিরিক্ত এইচটিপিপি কনটেন্ট শ্রেণির বংশধর রয়েছে


আপনার নিজস্ব উত্পন্ন ধরণের স্ট্রিংকন্টেন্ট তৈরি করার জন্য নীচে আমার পোস্টটি দেখুন (যেমন জেএসএন, এক্সএমএল ইত্যাদি)।
বাইটেদেভ

134

ব্যবহার করে আপনি প্রতিক্রিয়া তৈরি করা উচিত Request.CreateResponse :

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

আপনি কেবল ক্রিয়েটরেসপনসে স্ট্রিং না দিয়ে অবজেক্টগুলি পাস করতে পারেন এবং এটি অনুরোধের স্বীকৃতি শিরোনামের ভিত্তিতে সিরিয়ালিয়াল করা হবে। এটি আপনাকে ম্যানুয়ালি একটি ফর্ম্যাটর নির্বাচন করা থেকে বাঁচায়।


এটি স্বয়ংক্রিয়ভাবে সামগ্রীর ধরণের সাথে কাজ করে যাতে আপনি অতিরিক্ত কোড ছাড়াই এক্সএমএল /

আমি মনে করি CreateErrorResponse()প্রতিক্রিয়াটি যদি একটি ত্রুটি হয় তবে কল করা আরও সঠিক হবে , যেমনটি এই উত্তরটির উদাহরণে রয়েছে। আমার চেষ্টা-ধরা ইনসাইড আমি ব্যবহার করছি: this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "message", exception); এবং, এটা সঠিক উত্তর যদি আপনি সেই সমস্ত আহ্বানকারী এর স্বীকার করুন হেডার সম্মান নিয়ে উদ্বিগ্ন আছেন, অতিরিক্ত দূর্ভাগ্য ছাড়া (এবং আপনি WebAPI ব্যবহার করছেন)।
JMD

2
@ ফ্লোরিনডুমিট্রেস্কু তাঁর বক্তব্যটি হ'ল আপনি যখন উত্তরাধিকারী হন তখনই এটি কেবল তার জন্য কাজ করে 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 অবজেক্ট হিসাবে ফিরে আসতে পারে।


30
আমার ফরম্যাটটারটি কী
গ্রেগ জেড।

1
@ ব্যবহারকারী 1760329 এটি new JsonMediaTypeFormatter();আপনার ফরম্যাটের উপর নির্ভর করে একরকম বা অনুরূপ হতে পারে
জন

1
ObjectContentখুঁজে পাওয়া যায় না, ডাব্লুসিএফ ব্যবহার করে
মেডেট টেলিউকিবুলি

2
"এটিকে করার নতুন উপায়" হিসাবে আমি এটিকে যোগ্য করে তুলব না - যে নিবন্ধটি আপনি উল্লেখ করেছেন সেটিকে আপনি "[মিডিয়া-টাইপ] ফর্ম্যাটারের পুরো নিয়ন্ত্রণ" রাখতে চান "তবে বিকল্প হিসাবে এটি তালিকাভুক্ত করে
বার্ন

ধন্যবাদ @ প্রাইটার এটি আমার পক্ষে সত্যিই সহায়ক হয়েছে
তাই ব্যবহারকারী

53

সবচেয়ে সহজ একক-লাইন সমাধানটি ব্যবহার করা

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

সিরিয়ালযুক্ত জেএসওএন সামগ্রীর জন্য:

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

এটি আমার পক্ষে কার্যকর হয়নি কারণ IHttpActionResult এর জন্য পুনরায় প্রকারের রেসপন্সমেসেজআরসাল্ট দরকার requires আমি কী শেষ করেছি তার জন্য নীচে আমার উত্তরটি দেখুন। আরও মনে রাখবেন, আমি ন্যাশওয়ানের জসনকন্টে ফ্যাক্টরটি করেছি (যেমন স্ট্রিংকন্টেন্ট বেস ক্লাস থেকে প্রাপ্ত)।
অ্যাডাম কক্স

1
ঠিক তখনই এইচটিটিপিআরএসপোনসম্যাসেজটি মোড়ুন: নতুন রেসপন্সম্যাসেজরেসাল্ট ফিরিয়ে দিন (নতুন এইচটিপিআরপসনেসেসেস (HttpStatusCode.OK) {নতুন স্ট্রিংকন্ট ("আপনার বার্তা এখানে")}); :)
সাইমন ম্যাটেস

41

যে কোনও টি অবজেক্টের জন্য আপনি এটি করতে পারেন:

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

5
যদি আপনি উত্তরাধিকার সূত্রে পান তবে Requestকেবলমাত্র কোনও CreateResponseপদ্ধতির সাথেই উপলব্ধ ApiController। এটি ব্যবহার করলে চলবে না Controller
vapcguy

15

আপনি নিজের বিশেষায়িত সামগ্রীর প্রকার তৈরি করতে পারেন। উদাহরণস্বরূপ জসন সামগ্রীর জন্য একটি এবং এক্সএমএল বিষয়বস্তুর জন্য একটি (তারপরে এগুলি কেবলমাত্র 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 এর প্রয়োজনীয় রিটার্নম্যাসেজরেসাল্টের প্রয়োজনীয় রিটার্ন পূরণ করতে হবে। এছাড়াও ন্যাশওয়ানের জসন কনটেন্ট ব্যবহার করে, আমি শেষ করে দিয়েছি ...

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

জসনকন্টের জন্য ন্যাশওয়ানের উত্তর দেখুন।


স্ট্রিং
বিভাজন

0

কোনও সন্দেহ নেই যে আপনি সঠিক ফ্লোরিন। আমি এই প্রকল্পে কাজ করছিলাম, এবং এই কোডের টুকরোটি দেখতে পেয়েছি:

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

এর সাথে প্রতিস্থাপন করা যেতে পারে:

response.Content = new StringContent(string product);

1
এই উত্তরটি প্রশ্নের সাথে প্রাসঙ্গিক বলে মনে হচ্ছে না এবং কোনও বস্তুর (পণ্য) থেকে স্ট্রিংয়ে কীভাবে যেতে হবে তা দেখায় না
mageos
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.