現在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
のようなヘッダーを設定できません
だから私の質問は:なぜこの奇妙な反応が出るのですか?私には非常に奇妙な行動のようです
この記事 によると、ASP.NET Core MVCはデフォルトでHttpResponseMessage
- returningメソッドをサポートしていません。
引き続き使用したい場合は、WebApiCompatShimを使用して次のことができます。
Microsoft.AspNetCore.Mvc.WebApiCompatShim
_への参照を追加します。ConfigureServices()
で構成します:services.AddMvc().AddWebApiConventions();
Configure()
でルートを設定します:
_app.UseMvc(routes =>
{
routes.MapWebApiRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
_
Cache-Control
ヘッダーに文字列コンテンツを設定する場合は、次を試してください:
[Produces("text/plain")]
public string Tunnel()
{
Response.Headers.Add("Cache-Control", "no-cache");
return "blablabla";
}
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);
}