5

kullanarak istek başına taşıma içeriği Bir Web API uygulamasında, PerWebRequest ömrü ile yapılandırılmış hizmetler sağlamak için Castle Windsor'u kullanırım ve her şey IIS'de düzgün çalışır. Ancak, ASP.NET Web API Self Host (Beta) package'u kullandığımda, HTTP isteği başına bu hizmetleri kapsaması için özel bir ömür boyu oluşturmam gerekir.HttpRequestMessage.Properties

HttpRequestMessage.Properties kullanarak istek başına bağlamı nasıl taşıyabilirim?

cevap

8

Ben HttpRequestMessage.Property içine biraz da nesneyi ayarlamak için bir ileti işleyicisi kullanarak sizi öneririm:

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

Aslında API çağrısı sonradan bağlamı nasıl okunacağı söz asla. – BradLaney

+1

@BradLaney, doğru, örnek kodu güncelledim. – Shrike

+0

@ShrikeMay Kodunuzu daha genel yapmanızı öneririm? – user843681