5

In un'applicazione API Web, utilizzo Castle Windsor per fornire servizi configurati con PerWebRequest e tutto funziona correttamente su IIS.Caricamento del contesto per richiesta utilizzando HttpRequestMessage.Properties

Tuttavia, quando utilizzo l'API Web ASP.NET Self Host (Beta) package È necessario creare una durata personalizzata per l'ambito di tali servizi per richiesta HTTP.

Come posso trasportare il contesto per richiesta utilizzando HttpRequestMessage.Properties?

risposta

8

Io suggerirei di utilizzare un gestore di messaggi per impostare un po 'il vostro oggetto in HttpRequestMessage.Property:

public class MyApplication : HttpApplication 
{ 
    protected void Application_Start() 
    { 
     RegisterHttpMessageHandlers(GlobalConfiguration.Configuration); 
    } 
    public void RegisterHttpMessageHandlers(HttpConfiguration config) 
    { 
     config.MessageHandlers.Add(new MyMessageHandler()); 
    } 
} 

public static class MyHttpMessageHandlerExtensions 
{ 
    public static class HttpPropertyKey 
    { 
     public static readonly string MyProperty = "MyCompany_MyProperty"; 
    } 

    public static MyContext GetContext(this HttpRequestMessage request) 
    { 
     return (MyContext)request.Properties[HttpPropertyKey.MyProperty ]; 
    } 

    public static void SetContext(this HttpRequestMessage request, MyContext ctx) 
    { 
     request.Properties[HttpPropertyKey.MyProperty] = ctx; 
    } 
} 
public class MyMessageHandler : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     request.SetContext(new MyContext(){/*some your data*/}); 
     return base.SendAsync(request, cancellationToken); 
    } 
} 

public class MyController: ApiController 
{ 
    public object GetData() 
    { 
     MyContext ctx = this.Request.GetContext(); // the extenstion method is used 
    } 
} 
+1

Non si può mai parlare di come leggere in realtà il contesto più avanti nel chiamata API. – BradLaney

+1

@BradLaney, hai ragione, ho aggiornato il codice di esempio. – Shrike

+0

@ShrikeMay Consiglio di rendere il codice più generico? – user843681