web-dev-qa-db-ja.com

HttpResponseMessageヘッダーにContent-Typeヘッダーを設定できませんか?

ASP.NET WebApiを使用してRESTful APIを作成しています。コントローラーの1つでPUTメソッドを作成していますが、コードは次のようになります。

public HttpResponseMessage Put(int idAssessment, int idCaseStudy, string value) {
    var response = Request.CreateResponse();
    if (!response.Headers.Contains("Content-Type")) {
        response.Headers.Add("Content-Type", "text/plain");
    }

    response.StatusCode = HttpStatusCode.OK;
    return response;
}

AJAX経由でブラウザでその場所にPUTすると、次の例外が発生します。

誤ったヘッダー名。要求ヘッダーがHttpRequestMessageで使用され、応答ヘッダーがHttpResponseMessageで使用され、コンテンツヘッダーがHttpContentオブジェクトで使用されていることを確認してください。

しかし、Content-Typeは応答に対して完全に有効なヘッダーではありませんか?この例外が発生するのはなぜですか?

68
Jez

HttpContentHeaders.ContentTypeプロパティ をご覧ください。

response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain");

if (response.Content == null)
{
    response.Content = new StringContent("");
    // The media type for the StringContent created defaults to text/plain.
}
108
dtb

ASP Web API:EmptyContent type。に何かがありません。すべてのコンテンツ固有のヘッダーを許可しながら、空のボディを送信できます。

次のクラスをコードのどこかに配置します。

_public class EmptyContent : HttpContent
{
    protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
    {
        return Task.CompletedTask;
    }
    protected override bool TryComputeLength(out long length)
    {
        length = 0L;
        return true;
    }
}
_

その後、必要に応じて使用します。これで、追加のヘッダー用のコンテンツオブジェクトが作成されました。

_response.Content = new EmptyContent();
response.Content.Headers.LastModified = file.DateUpdatedUtc;
_

new StringContent(string.Empty)の代わりにEmptyContentを使用する理由

  • StringContent は、多くのコードを実行する重いクラスです(継承するため ByteArrayContent
    • 数ナノ秒を節約しましょう
  • StringContentは、無駄な/問題のあるヘッダーを追加します:_Content-Type: plain/text; charset=..._
    • それで、数バイトのネットワークバイトを節約しましょう
0
SandRock