web-dev-qa-db-ja.com

ASP.NET Core HTTPRequestMessageが奇妙なJSONメッセージを返す

現在ASP.NET Core RC2を使用していて、奇妙な結果が出ています。だから私は次の機能を持つMVCコントローラーを持っています:

public HttpResponseMessage Tunnel() {
    var message = new HttpResponseMessage(HttpStatusCode.OK);
    message.Content = new StringContent("blablabla", Encoding.UTF8);
    message.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/plain");
    message.Headers.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue {
        NoCache = true
    };

    return message;
}

Acceptヘッダーをテキストプレーンに設定してpostmanでこれを呼び出すと、次の応答が得られます。

{
  "Version": {
    "Major": 1,
    "Minor": 1,
    "Build": -1,
    "Revision": -1,
    "MajorRevision": -1,
    "MinorRevision": -1
  },
  "Content": {
    "Headers": [
      {
        "Key": "Content-Type",
        "Value": [
          "text/plain"
        ]
      }
    ]
  },
  "StatusCode": 200,
  "ReasonPhrase": "OK",
  "Headers": [
    {
      "Key": "Cache-Control",
      "Value": [
        "no-cache"
      ]
    }
  ],
  "RequestMessage": null,
  "IsSuccessStatusCode": true
}

これが上記のコントローラーに対してどのように生成された応答であるかは、本当にわかりません。これは基本的にメッセージ全体のJSONシリアライゼーションであり、私が送信するつもりの「blablabla」を含んでいません。

目的の結果を得る唯一の方法は、コントローラー関数にstringではなくHttpResponseを返すことですが、その方法ではCacheControlのようなヘッダーを設定できません

だから私の質問は:なぜこの奇妙な反応が出るのですか?私には非常に奇妙な行動のようです

15
larzz11

この記事 によると、ASP.NET Core MVCはデフォルトでHttpResponseMessage- returningメソッドをサポートしていません。

引き続き使用したい場合は、WebApiCompatShimを使用して次のことができます。

  1. プロジェクトに_Microsoft.AspNetCore.Mvc.WebApiCompatShim_への参照を追加します。
  2. ConfigureServices()で構成します:services.AddMvc().AddWebApiConventions();
  3. Configure()でルートを設定します:

    _app.UseMvc(routes =>
    {
        routes.MapWebApiRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
    _
12
svick

Cache-Controlヘッダーに文字列コンテンツを設定する場合は、次を試してください:

[Produces("text/plain")]
public string Tunnel()
{
    Response.Headers.Add("Cache-Control", "no-cache");
    return "blablabla";
}
1
adem caglin

ASP.NET Coreで、パイプラインを通過する応答を変更します。したがって、ヘッダーの場合は this answer のように直接設定します。 (私はCookieを設定するためにこれをテストしました。)この方法でHTTPステータスコードを設定することもできます。

コンテンツを設定して特定のフォーマッターを使用するには、ドキュメント ASP.NET Core Web APIでの応答データのフォーマット に従ってください。これにより、JsonResult()ContentResult()などのヘルパーを使用できるようになります。

コードを翻訳する完全な例は次のようになります。

[HttpGet("tunnel")]
public ContentResult Tunnel() {
    var response = HttpContext.Response;
    response.StatusCode = (int) HttpStatusCode.OK;
    response.Headers[HeaderNames.CacheControl] = CacheControlHeaderValue.NoCacheString;
    return ContentResult("blablabla", "text/plain", Encoding.UTF8);
}
1
Alex Angas