現在のリクエストメディアタイプフォーマッタに基づいて返される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のようなもの
不可能な場合、上記のメソッドを実装して、現在のリクエストにどのフォーマッタを使用する必要があるかを知る方法はありますか?
私が最近発見したように、それは不可能ではありません。実際には、現在のHttpContext(ある場合)のItemsプロパティに追加されます= [
HttpRequestMessage httpRequestMessage = HttpContext.Current.Items["MS_HttpRequestMessage"] as HttpRequestMessage
編集:
これはWebAPI v2の時点です。以前のバージョンを確認することはできません。
Web APIチームがCreateResponseメソッドで行ったことを実行してみませんか? Controllerの拡張メソッドにします。この方法では、コードを別のクラスライブラリに保持できますが、メソッドはコントローラーインスタンスにアクセスできるため、すべての構成情報にアクセスできます。
また、少し異なる点については、独自に作成するのではなく、エラー応答の標準化の取り組みを検討することをお勧めします。
例えば。:
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();