এএসপি.নেট ওয়েব এপিআইকে সাধারণ পাঠ্য ফেরত দেওয়ার জন্য কি কোনও উপায় আছে?


125

আমাকে একটি এএসপি.নেট ওয়েব এপিআই কন্ট্রোলারের কাছ থেকে সরল পাঠ্যে প্রতিক্রিয়া ফিরে পাওয়া দরকার।

আমি একটি অনুরোধ করার চেষ্টা করেছি Accept: text/plainকিন্তু এটি কৌশলটি মনে হচ্ছে না। এছাড়াও, অনুরোধটি বাহ্যিক এবং আমার নিয়ন্ত্রণের বাইরে। আমি যা অর্জন করব তা হ'ল পুরানো এএসপি.নেট উপায় নকল করা:

context.Response.ContentType = "text/plain";
context.Response.Write("some text);

কোন ধারনা?

সম্পাদনা, সমাধান : আলিওস্টাডের উত্তরের ভিত্তিতে, আমি ওয়েবএপিক্ট্রিবিব পাঠ্য বিন্যাসটি যুক্ত করেছি, এটি অ্যাপ্লিকেশন_স্টার্টে আরম্ভ করেছি:

  config.Formatters.Add(new PlainTextFormatter());

এবং আমার নিয়ামক এরকম কিছু শেষ করেছিল:

[HttpGet, HttpPost]
public HttpResponseMessage GetPlainText()
{
  return ControllerContext.Request.CreateResponse(HttpStatusCode.OK, "Test data", "text/plain");
}

উত্তর:


231

হুম ... আমি মনে করি না এই কাজটি করার জন্য আপনার একটি কাস্টম ফর্ম্যাটর তৈরি করার দরকার নেই। পরিবর্তে এই বিষয়বস্তু ফিরে:

    [HttpGet]
    public HttpResponseMessage HelloWorld()
    {
        string result = "Hello world! Time is: " + DateTime.Now;
        var resp = new HttpResponseMessage(HttpStatusCode.OK);
        resp.Content = new StringContent(result, System.Text.Encoding.UTF8, "text/plain");
        return resp;
    }

এটি কাস্টম বিন্যাস ব্যবহার না করে আমার পক্ষে কাজ করে।

আপনি যদি স্পষ্টভাবে আউটপুট তৈরি করতে চান এবং স্বীকার করুন শিরোনামের উপর ভিত্তি করে ডিফল্ট সামগ্রীর আলোচনাকে ওভাররাইড করতে চান তবে আপনি ব্যবহার করতে চাইবেন না Request.CreateResponse()কারণ এটি মাইম টাইপটিকে বাধ্য করে।

পরিবর্তে স্পষ্টভাবে একটি নতুন তৈরি করুন HttpResponseMessageএবং ম্যানুয়ালি কন্টেন্ট বরাদ্দ করুন। উপরের উদাহরণটি ব্যবহার করে StringContentতবে বিভিন্ন। নেট তথ্য প্রকার / কাঠামোগুলি থেকে ডেটা ফেরত দেওয়ার জন্য বেশ কয়েকটি অন্যান্য সামগ্রীর ক্লাস উপলব্ধ।


1
এটি আসলে আমি যে সমাধানটি দিয়েছিলাম সে কারণ এটি হ'ল আমার এপিআই সমস্ত পদ্ধতিতে 99% জেএসএন বস্তুগুলি ফিরিয়ে দেবে, কেবলমাত্র কয়েকটি (খুব অল্প কিছু) পদ্ধতির জন্য সরল স্ট্রিং প্রতিক্রিয়াগুলির প্রয়োজন হবে (এবং তাদের অনেকের জন্য আমি ডেটা ফিরতে মেমোরিস্ট্রিম ব্যবহার করি সরাসরি প্রতিক্রিয়াতে তাই এটি একটি নন-ইস্যু ছিল Only) কেবলমাত্র 2 বা 3 পদ্ধতিতে আমি একটি .NET স্ট্রিং ফিরিয়েছিলাম এবং এটি JSON স্ট্রিং হিসাবে ফিরে আসছিল। আপনার উত্তর, আইএমএইচও, এই সমস্যার জন্য KISS প্রতিক্রিয়া (যদিও এটি 100% DRY নয়, তবে আমি এটি করার জন্য স্ট্রিংয়ের জন্য কেবল একটি এক্সটেনশন পদ্ধতি লিখেছিলাম ... :-) চমৎকার!) স্ট্রিংকন্টটি খুব সুন্দর nice ধন্যবাদ.
লাউডেনভিয়ার

নির্দিষ্ট ধরণের সামগ্রী তৈরি করতে প্রচুর কাস্টম XXX কনটেস্ট ক্লাস রয়েছে যা এই ধরণের জিনিসটিকে বেশ সোজা করে এগিয়ে দেয়।
রিক স্ট্রহল

আমি এই পদ্ধতির সাথে সঠিক প্রতিক্রিয়া দেখছি। যাইহোক, এইচটিটিপি কনটেক্সট.কন্টেন এখন শূন্য। এই সম্পর্কে কোন ধারণা?
নচিকেত মেহতা

@ জাভাস্ক্রিপ্টএনথুশিয়াস্ট - এইচটিটিপি কনটেক্সট.কেন্দ্রন সম্ভবত সম্ভবত সিস্টেম-ওয়েবে পাইপলাইন ছাড়াই ওউইন স্ট্যাকের মাধ্যমে স্ব-হোস্টিং করছেন বা চলছে are যদিও এই সমাধানের সাথে সম্পর্কিত নয়।
রিক স্ট্রহল

15

আপনি যদি অতিরিক্ত নির্ভরতা যুক্ত না করে কেবল একটি সাধারণ প্লেইন / পাঠ্য বিন্যাসের সন্ধান করছেন তবে এটি কৌশলটি করা উচিত।

public class TextPlainFormatter : MediaTypeFormatter
{
    public TextPlainFormatter()
    {
        this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain"));
    }

    public override bool CanWriteType(Type type)
    {
        return type == typeof(string);
    }

    public override bool CanReadType(Type type)
    {
        return type == typeof(string);
    }

    public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, TransportContext transportContext)
    {
        return Task.Factory.StartNew(() => {
            StreamWriter writer = new StreamWriter(stream);
            writer.Write(value);
            writer.Flush();
        });
    }

    public override Task<object> ReadFromStreamAsync(Type type, Stream stream, HttpContentHeaders contentHeaders, IFormatterLogger formatterLogger)
    {
        return Task.Factory.StartNew(() => {
            StreamReader reader = new StreamReader(stream);
            return (object)reader.ReadToEnd();
        });
    }
}

এটি আপনার গ্লোবাল ওয়েব এপিআই কনফিগারেশনে যুক্ত করতে ভুলবেন না।

config.Formatters.Add(new TextPlainFormatter());

এখন আপনি স্ট্রিং অবজেক্টগুলিতে পাস করতে পারেন

this.Request.CreateResponse(HttpStatusCode.OK, "some text", "text/plain");

12
  • এএসপি.নেট ওয়েব এপিআই-তে প্রসঙ্গটি ব্যবহার না করার জন্য দয়া করে সাবধান হন বা আপনি তাড়াতাড়ি বা পরে দুঃখিত হবেন। এএসপি.নেট ওয়েব এপিআইয়ের অ্যাসিনক্রোনাস প্রকৃতি HttpContext.Currentকোনও দায়বদ্ধতা ব্যবহার করে ।
  • একটি সরল পাঠ্য বিন্যাস ব্যবহার করুন এবং আপনার বিন্যাসগুলিতে যুক্ত করুন। তাদের চারপাশে কয়েক ডজন আছে। আপনি সহজেই আপনার লিখতে পারে। WebApiContrib এর একটি রয়েছে।
  • আপনি বিষয়বস্তুর প্রকার হেডার সেটিং দ্বারা এটি জোর করতে পারেন httpResponseMessage.Headersথেকে text/plainআপনার নিয়ামক দেওয়া আপনি প্লেইন টেক্সট ফরম্যাটার নিবন্ধীকৃত করেছেন।

চিন্তিত হবেন না, আমি এইচটিটিপি কনটেক্সট অবজেক্টটি ব্যবহারের উদ্দেশ্যে বা তাত্পর্যপূর্ণও করি নি, আমি কেবল এটি ক্লাসিক এএসপিতে কীভাবে করব তা চিত্রিত করার জন্য এটি যুক্ত করেছি
ম্যাগনাস জোহানসন

ওয়েল, অজানা, আমি ইতিমধ্যে WebAPIContrib উল্লেখ করেছি, কখনও কখনও এটি সহজ।
ম্যাগনাস জোহানসন

@ ম্যাগনুস শিওর আমি যা লিখেছিলাম তা পড়ার পরে আমি আসলে শব্দটির পরিবর্তন করেছি। তবে অন্য উত্তরটি পড়ার ফলে আমি সেই প্রথম বিষয়টিকে চাপ দিয়েছিলাম।
অলিওস্টাড

আপনি HTTPContext ব্যবহার না করার জন্য বলছেন। বর্তমান, বিকল্পগুলি কি?
সূর্য

@ স্পাইডারদেবিল হ্যাঁ, আমি যা বলছি তা একেবারেই। আপনার এটি প্রয়োজন হবে না, সরাসরি অনুরোধ / প্রতিক্রিয়া / কনফিগারেশন পাস করুন।
Aliostad


6

যখন গ্রহণ করুন: পাঠ্য / প্লেইন কাজ করে না, তারপরে পাঠ্য মাইম ধরণের কোনও নিবন্ধিত বিন্যাস নেই।

পরিষেবা কনফিগারেশন থেকে সমস্ত সমর্থিত বিন্যাসের তালিকা পেয়ে নির্দিষ্ট মাইম প্রকারের জন্য কোনও বিন্যাসক নেই তা আপনি নিশ্চিত করতে পারেন।

একটি খুব সোজা মিডিয়া টাইপ ফর্ম্যাটার তৈরি করুন যা পাঠ্য মাইম প্রকারগুলিকে সমর্থন করে।

http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters


আশা করি আমিও আপনার উত্তরটি গ্রহণ করতে পারতাম, গৃহীত উত্তরটি আমার নিজের ফর্ম্যাটর লেখার ঝামেলা বাঁচিয়েছিল। কমপক্ষে +1।
ম্যাগনাস জোহানসন

0

নিম্নলিখিতগুলির মতো একটি এক্সটেনশান লাইনের সংখ্যা হ্রাস করতে পারে এবং আপনার কোডটি সুন্দর করতে পারে:

public static class CommonExtensions
{
    public static HttpResponseMessage ToHttpResponseMessage(this string str)
    {
        var resp = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StringContent(str, System.Text.Encoding.UTF8, "text/plain")
        };

        return resp;
    }
}


এখন আপনি এটিতে সংজ্ঞায়িত এক্সটেনশনটি গ্রাস করতে পারেন Web API:

public class HomeController : ApiController
{
    [System.Web.Http.HttpGet]
    public HttpResponseMessage Index()
    {
        return "Salam".ToHttpResponseMessage();
    }
}


রাউটিংয়ের মাধ্যমে {DOMAIN}/api/Home/Indexআপনি নীচের সরল পাঠটি দেখতে পাচ্ছেন:

MyPlainTextResponse


স্ট্রিংয়ের সাথে সম্পর্কযুক্ত স্টাফের সাথে স্ট্রিং নেমস্পেসটি অপচয় করবেন না।
রামবালাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.