131

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

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

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

何か案は?

編集、ソリューション: Aliostad の回答に基づいて、WebAPIContribテキスト フォーマッタを追加し、Application_Start で初期化しました。

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

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

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

6 に答える 6

241

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

    [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()出力を明示的に作成し、Acceptヘッダーに基づいてデフォルトのコンテンツネゴシエーションをオーバーライドする場合は、mimeタイプが強制されるため、使用したくありません。

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

于 2012-10-23T10:04:42.423 に答える
20

.net コアの場合:

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

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

于 2017-04-04T21:30:30.650 に答える
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();
        });
    }
}

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

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

文字列オブジェクトを渡すことができるようになりました

this.Request.CreateResponse(HttpStatusCode.OK, "some text", "text/plain");
于 2012-10-13T07:35:25.480 に答える
12
  • ASP.NET Web API でコンテキストを使用しないように注意してください。使用しないと、遅かれ早かれ後悔することになります。ASP.NET Web API の非同期性により、使用HttpContext.Currentに問題が生じます。
  • プレーン テキスト フォーマッタを使用して、フォーマッタに追加します。周りに何十匹もいます。あなたも簡単に書くことができます。WebApiContribには 1 つがあります。
  • プレーンテキストフォーマッターを登録している場合は、コントローラーでコンテンツタイプヘッダーをオンhttpResponseMessage.Headersに設定することで強制できます。text/plain
于 2012-07-20T15:19:56.087 に答える
6

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

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

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

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

于 2012-07-20T14:53:32.673 に答える