Sto lavorando a un progetto ASP.NET Web Api e l'ho fatto accettare le informazioni sulla versione nell'URL.Web Api - Parametri richiesta esterno controller
Ad esempio:
- api/v1/MyController
- api/v2/MyController
Ora vorrei ottenere la richiesta di versione v1, v2 all'interno di un personalizzato LayoutRenderer per Nlog
. Normalmente lo farei come nell'esempio seguente.
[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);
}
}
Il problema:HttpContext.Current
è NULL
Credo che questo sia perché io uso Async wrappers per NLog
e alcune chiamate prima del Logger sono anche Async
.
Un esempio del logger chiamato async all'interno di Ninject.Extensions.WebApi.UsageLogger. A questo punto lo HttpRequestMessage
ha tutte le informazioni necessarie per ottenere la versione.
/// <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;
}
La domanda quale sarebbe il modo migliore per rendere il VersionLayoutRenderer
lavoro in un generico modo ? Posso aggiungere un MessageHandler e associare HttpRequest ad un ambito Async? Se così fosse, qualsiasi linea guida sarebbe molto apprezzata perché mi sto ancora abituando allo Ninject
.
Per ora aggiungo le informazioni sulla versione direttamente al registro chiamate in UsageHandler, ma mi piacerebbe davvero una soluzione più generica, in cui posso sempre fare affidamento sulle informazioni sulla versione all'interno della mia registrazione.
Modifica: Aggiornato la domanda per essere più specifici e inclusi ulteriori dettagli.
Puoi pubblicare il codice dove stai usando async – Jonathan
Jonathan, per favore vedi la domanda aggiornata Spero che contenga tutte le informazioni che ti servono e altrimenti chiedi informazioni. –