2017-07-06 51 views
0

我們正在致力於WCF路由服務,將不同的soap動作重定向到不同的端點。WCF RoutingService - 使用查詢字符串重定向

我們希望將此服務重寫查詢字符串包含在路由器url中:#router url#?param=param到endpoint:#endpoint url#?param=param

我們的webservices在直接調用時接受查詢字符串,這些字符串在路由器(上下文)中可見,但最終這些字符串從url中刪除。

你知道如何在每個請求中將這些字符串添加到端點url的末尾嗎?

回答

0

我們解決了這個問題。

您必須創建新的綁定:

public class QueryHttpBinding : BasicHttpBinding 
{ 
    public override BindingElementCollection CreateBindingElements() 
    { 
     var result = base.CreateBindingElements(); 

     var http = result.Find<HttpTransportBindingElement>(); 
     if (http != null) 
     { 
      http.ManualAddressing = true; 
     } 

     var https = result.Find<HttpsTransportBindingElement>(); 
     if (https != null) 
     { 
      https.ManualAddressing = true; 
     } 

     return result; 
    } 
} 

和客戶端消息檢查:

public class CustomInspectorBehavior : IClientMessageInspector 
{ 
    object IClientMessageInspector.BeforeSendRequest(ref Message request, IClientChannel channel) 
    { 
     UriBuilder builder = new UriBuilder(channel.RemoteAddress.ToString()); 
     builder.Path += "?" + ((HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name]).QueryString; 
     request.Headers.To = builder.Uri; 
     return null; 
    } 

    void IClientMessageInspector.AfterReceiveReply(ref Message reply, object correlationState) 
    { 
    } 

} 

接下來,您必須創建新的端點行爲:

public class Behavior : IEndpointBehavior 
{ 
    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) 
    { 
    } 

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) 
    { 
     var inspector = new CustomInspectorBehavior(); 
     clientRuntime.MessageInspectors.Add(inspector); 
    } 

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) 
    { 
    } 

    public void Validate(ServiceEndpoint endpoint) 
    { 
    } 
}