2011-12-08 182 views
1

我需要爲每個從Silverlight應用程序創建的每個RIA服務請求傳遞一個HTTP標頭。標題的值需要來自應用實例,而不是來自cookie。我知道這可以通過將它放在DTO中來實現,但這不是一種選擇,因爲我們的許多服務調用使用實體和更改集合,所以沒有基類可以適用於所有請求。所以我正在尋找一種集中和安全的方式來將每個請求傳遞回去,以便開發人員不必擔心。自定義HTTP標頭可以正常工作,但我不知道如何攔截出站請求來設置它。如何將HTTP請求標題添加到Silverlight RIA請求

任何人有任何想法,我可以嘗試?

回答

3

在較低級別上,您可以在IClientMessageInspector的幫助下添加HTTP標頭。嘗試從this post on SL forum開始。

下一步取決於您的使用情況。

如果頭部的值必須與DomainContext調用的任何方法相同,那麼您可以使用partial類擴展上下文,爲頭部值添加屬性並在檢查器中使用該屬性。

如果您需要爲每個方法調用傳遞不同的值,您可能需要將您的DomainContext包裝到另一個類中,併爲上下文的每個方法添加一個參數,以接受標頭值並將其傳遞給檢查員莫名其妙。不用說,沒有代碼生成器,這將是困難的。

下面是來自SL論壇第一種情況的調整採樣:我需要

public sealed partial class MyDomainContext 
{ 
    public string HeaderValue { get; set; } 

    partial void OnCreated() 
    { 
    WebDomainClient<IMyDomainServiceContract> webDomainClient = (WebDomainClient<IMyDomainServiceContract>)DomainClient; 
    CustomHeaderEndpointBehavior customHeaderEndpointBehavior = new CustomHeaderEndpointBehavior(this); 
    webDomainClient.ChannelFactory.Endpoint.Behaviors.Add(customHeaderEndpointBehavior); 
    } 
} 

public class CustomHeaderEndpointBehavior : IEndpointBehavior 
{ 
    MyDomainContext _Ctx; 

    public CustomHeaderEndpointBehavior(MyDomainContext ctx) 
    { 
    this._Ctx = ctx; 
    }  

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { } 
    public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) 
    { 
    clientRuntime.MessageInspectors.Add(new CustomHeaderMessageInspector(this._Ctx)); 
    } 
    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) { } 
    public void Validate(ServiceEndpoint endpoint) { } 
} 

public class CustomHeaderMessageInspector : IClientMessageInspector 
{ 
    MyDomainContext _Ctx; 

    public CustomHeaderMessageInspector(MyDomainContext ctx) 
    { 
    this._Ctx = ctx; 
    } 

    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState) {} 
    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel) 
    { 
    string myHeaderName = "X-Foo-Bar"; 
    string myheaderValue = this._Ctx.HeaderValue; 

    HttpRequestMessageProperty property = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name]; 
    property.Headers[myHeaderName] = myheaderValue; 
    return null; 
    } 
} 
+0

究竟是什麼。事實上,我應該知道自從我使用WCF擴展點在服務器上做類似的事情。感謝Pavel !. –