web-dev-qa-db-ja.com

現在のHttpRequestMessageオブジェクトにグローバルにアクセスする方法は?

現在のリクエストメディアタイプフォーマッタに基づいて返されるErrorオブジェクトを含むHttpResponseMessageを作成するメソッドがあります。

現在、XmlMediaTypeFormatterをハードコーディングしていますが、実行時に現在のリクエストMediaTypeFormatterを見つけたいのですが、以下のコードが別のクラスライブラリに存在するため、現在のリクエストオブジェクトにアクセスできません。

private HttpResponseMessage Create(HttpStatusCode statusCode, string errorCode, string errorMessage)
{
    var result = new HttpResponseMessage(statusCode)
        {
            Content = new ObjectContent<Error>(new Error()
            {
                Code = errorCode,
                Message = errorMessage
            }, new XmlMediaTypeFormatter())
        };
    return result;
}

現在のHttpRequestMessageオブジェクトにグローバルにアクセスする方法は? HttpContext.Current.Requestのようなもの

不可能な場合、上記のメソッドを実装して、現在のリクエストにどのフォーマッタを使用する必要があるかを知る方法はありますか?

38
The Light

私が最近発見したように、それは不可能ではありません。実際には、現在のHttpContext(ある場合)のItemsプロパティに追加されます= [

HttpRequestMessage httpRequestMessage = HttpContext.Current.Items["MS_HttpRequestMessage"] as HttpRequestMessage

編集:

これはWebAPI v2の時点です。以前のバージョンを確認することはできません。

72
dariusc

Web APIチームがCreateResponseメソッドで行ったことを実行してみませんか? Controllerの拡張メソッドにします。この方法では、コードを別のクラスライブラリに保持できますが、メソッドはコントローラーインスタンスにアクセスできるため、すべての構成情報にアクセスできます。

また、少し異なる点については、独自に作成するのではなく、エラー応答の標準化の取り組みを検討することをお勧めします。

例えば。:

1
Darrel Miller

Autofacでアーカイブを試みることができます。例えば

public class MyPrincipal : IPrincipal
    {
        private readonly IPrincipal principal_;

        public MyPrincipal(ILifetimeScope scope)
        {
            if (scope.Tag == null || scope.Tag != MatchingScopeLifetimeTags.RequestLifetimeScopeTag)
            {
                throw new Exception("Invalid scope");
            }

            principal_ = scope.Resolve<HttpRequestMessage>().GetRequestContext().Principal;
        }
}

このクラスは、InstancePerRequestライフタイムで登録できます。

   builder.RegisterType<MyPrincipal>().As<IPrincipal>().InstancePerRequest();
0
Lonli-Lokli