9

HttpRequestBaseをとしてラップしていHttpRequestMessageます。これには、すべてのヘッダーをコピーする必要があります。しかしHttpRequestMessage、request オブジェクトと Content オブジェクトに適用されるヘッダーが異なるため、httpRequest.Headers.Add以下の行で InvalidOperationException がスローされることがあります。

public static HttpRequestMessage AsHttpRequestMessage(this HttpRequestBase request) {
    Requires.NotNull(request, "request");

    var httpRequest = new HttpRequestMessage(new HttpMethod(request.HttpMethod), request.Url);
    foreach (string header in request.Headers) {
        httpRequest.Headers.Add(header, request.Headers.GetValues(header));
    }

    if (request.Form != null) {
        // Avoid a request message that will try to read the request stream twice for already parsed data.
        httpRequest.Content = new FormUrlEncodedContent(request.Form.AsKeyValuePairs());
    } else if (request.InputStream != null) {
        httpRequest.Content = new StreamContent(request.InputStream);
    }

    return httpRequest;
}

明らかに、コードで例外をスローするのではなく、各ヘッダーを適切なオブジェクトに適切に適用したいと考えています。どうすればこれを予測できますか? 例外を生成してキャッチするヘッダー以外のヘッダーの適用性をテストするために使用できる方法はありますか?

4

2 に答える 2

15

それは非常に単純であることがわかりました。このスニペットは、ASP.NET 独自のオープン ソース ソース コードから大きな影響を受けています。

/// <summary>
/// Clones an <see cref="HttpWebRequest" /> in order to send it again.
/// </summary>
/// <param name="message">The message to set headers on.</param>
/// <param name="request">The request with headers to clone.</param>
internal static void CopyHeadersFrom(this HttpRequestMessage message, HttpRequestBase request) {
    Requires.NotNull(request, "request");
    Requires.NotNull(message, "message");

    foreach (string headerName in request.Headers) {
        string[] headerValues = request.Headers.GetValues(headerName);
        if (!message.Headers.TryAddWithoutValidation(headerName, headerValues)) {
            message.Content.Headers.TryAddWithoutValidation(headerName, headerValues);
        }
    }
}
于 2013-03-05T23:20:25.970 に答える
1

Add の代わりに TryAddWithoutValidation を使用して、スローを回避できるはずです。リクエストをバッファリングするかどうかによって、GetBufferlessStream を呼び出すかどうかに注意する必要があります。次のクラスの ConvertRequest メソッドを参照してください: http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/4764b0111b91#src/System.Web.Http.WebHost/HttpControllerHandler.cs

于 2013-03-05T08:09:04.703 に答える