web-dev-qa-db-ja.com

ASP.NET Web APIに強制的にプレーンテキストを返す方法はありますか?

ASP.NET Web APIコントローラーからプレーンテキストで応答を取得する必要があります。

Accept: text/plainでリクエストを実行しようとしましたが、うまくいかないようです。その上、リクエストは外部のものであり、私の制御の範囲外です。私が達成することは、古いASP.NETの方法を模倣することです:

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

何か案は?

EDIT、solution:Aliostadの回答に基づいて、 WebAPIContrib テキストフォーマッターを追加し、Application_Startで初期化しました:

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

そして私のコントローラーは次のようなものになりました:

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

うーん...私はあなたがこの仕事をするためにカスタムフォーマッタを作成する必要はないと思います。代わりに、次のようなコンテンツを返します。

    [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;
    }

これは、カスタムフォーマッタを使用せずに機能します。

明示的に出力を作成し、Acceptヘッダーに基づいてデフォルトのコンテンツネゴシエーションをオーバーライドする場合、MIMEタイプを強制するため、Request.CreateResponse()は使用しません。

代わりに、新しいHttpResponseMessageを明示的に作成し、コンテンツを手動で割り当てます。上記の例ではStringContentを使用していますが、さまざまな.NETデータ型/構造からデータを返すために利用できるコンテンツクラスは他にも多数あります。

222
Rick Strahl

追加の依存関係を追加せずに単純なプレーン/テキストフォーマッターを探しているだけなら、これでうまくいくはずです。

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();
        });
    }
}

グローバルWeb API設定に追加することを忘れないでください。

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

これで、文字列オブジェクトを

this.Request.CreateResponse(HttpStatusCode.OK, "some text", "text/plain");
14
Despertar
  • ASP.NET Web APIでコンテキストを使用しないように注意してください。遅かれ早かれ申し訳ありません。 ASP.NET Web APIの非同期の性質により、HttpContext.Currentの使用が不利になります。
  • プレーンテキストフォーマッターを使用して、フォーマッターに追加します。それらの周りには何十ものがあります。あなたも簡単に書くことができます。 WebApiContrib には1つあります。
  • プレーンテキストフォーマッターを登録している場合、コントローラーでhttpResponseMessage.Headersのコンテンツタイプヘッダーをtext/plainに設定することで強制できます。
12
Aliostad

Accept:text/plainが機能しない場合、テキストMIMEタイプ用の登録済みフォーマッターはありません。

サービス構成からサポートされているすべてのフォーマッターのリストを取得することにより、指定されたMIMEタイプのフォーマッターがないことを確認できます。

テキストMIMEタイプをサポートする非常に簡単なメディアタイプフォーマッタを作成します。

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

6
Regfor

.netコアの場合:

[HttpGet("About")]
public ContentResult About()
{
    return Content("About text");
}

https://docs.Microsoft.com/en-us/aspnet/core/mvc/models/formatting

5
rook

次のような拡張機能を使用すると、行数を減らしてコードを美しくすることができます。

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

0
Siyavash Hamdi