ASP.NET Web Api プロジェクトに取り組んでおり、URL でバージョン情報を受け入れるようにしました。
例えば:
- API/v1/マイコントローラー
- API/v2/マイコントローラー
ここで、カスタム LayoutRenderer for 内でリクエスト バージョンv1、v2を取得したいと思いNlog
ます。通常、私は以下の例のようにこれを行います。
[LayoutRenderer("Version")]
public class VersionLayoutRenderer : LayoutRenderer
{
protected override void Append(System.Text.StringBuilder builder, NLog.LogEventInfo logEvent)
{
var version = HttpContext.Current.Request.RequestContext.RouteData.Values["Version"];
builder.Append(version);
}
}
問題: HttpContext.Current
NULL です
これは、Async ラッパーを使用しNLog
ており、Logger の前のいくつかの呼び出しもAsync
.
Ninject.Extensions.WebApi.UsageLogger 内で Async と呼ばれるロガーの例。この時点でHttpRequestMessage
、バージョンを取得するために必要なすべての情報が含まれています。
/// <summary>
/// Initializes a new instance of the <see cref="UsageHandler" /> class.
/// </summary>
public UsageHandler()
{
var kernel = new StandardKernel();
var logfactory = kernel.Get<ILoggerFactory>();
this.Log = logfactory.GetCurrentClassLogger();
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var startTime = DateTime.Now;
// Log request
await request.Content.ReadAsStringAsync().ContinueWith(c =>
{
this.Log.Info("{0}: {1} called from {2}", request.Method, HttpUtility.UrlDecode(request.RequestUri.AbsoluteUri), ((HttpContextBase)request.Properties["MS_HttpContext"]).Request.UserHostAddress);
this.Log.Info("Content-Type: {0}, Content-Length: {1}", request.Content.Headers.ContentType != null ? request.Content.Headers.ContentType.MediaType : string.Empty, request.Content.Headers.ContentLength);
this.Log.Info("Accept-Encoding: {0}, Accept-Charset: {1}, Accept-Language: {2}", request.Headers.AcceptEncoding, request.Headers.AcceptCharset, request.Headers.AcceptLanguage);
if (!string.IsNullOrEmpty(c.Result))
{
if (this.MaxContentLength > 0 && c.Result.Length > this.MaxContentLength)
{
this.Log.Info("Data: {0}", HttpUtility.UrlDecode(c.Result).Substring(0, this.MaxContentLength - 1));
}
else
{
this.Log.Info("Data: {0}", HttpUtility.UrlDecode(c.Result));
}
}
});
var response = await base.SendAsync(request, cancellationToken);
// Log the error if it returned an error
if (!response.IsSuccessStatusCode)
{
this.Log.Error(response.Content.ReadAsStringAsync().Result);
}
// Log performance
this.Log.Info("Request processing time: " + DateTime.Now.Subtract(startTime).TotalSeconds + "s");
return response;
}
質問一般的なVersionLayoutRenderer
方法で作業
を行うための最良の方法は何ですか? MessageHandler を追加して、HttpRequest を Async スコープにバインドできますか? もしそうなら、私はまだ慣れていないので、ガイドラインをいただければ幸いです。 Ninject
当分の間、UsageHandler の Log Call にバージョン情報を直接追加しますが、ログ内のバージョン情報に常に依存できる、より一般的なソリューションが本当に必要です。
編集:質問をより具体的に更新し、詳細を含めました。