在之前的一篇文章中,说明了我们如何用 WSDL 档案产生代理类别,现在目标的 Web Service 有一个需求是要加入一个 Http Header,网路上可能会找到覆写 GetWebRequest()
的解法,但我们会发现,用 dotnet-svcutil 所产生的代理类别无法覆写 GetWebRequest(),该怎么办?
开头提到的解法,是古早时候 ASP.NET 2.0 时代的 Web Service 代理类别所使用的,后来 WCF 推出之后,Web Service 的发展重心就移到了 WCF 上,并且向下相容 ASP.NET 2.0 的 Web Service,所以我们加入 Http Header 的方法完全不一样。
解法的方向一样是在 Http Request 送出去之前,加入 Http Header,需要实作两个介面。
实作 IClientMessageInspector
在 BeforeSendRequest()
之中,将我们需要的 Http Header 加到 Http Request。
public class HttpHeadersMessageInspector : IClientMessageInspector
{
public void AfterReceiveReply(ref Message reply, object correlationState)
{
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
var httpRequest = request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out var property)
? (HttpRequestMessageProperty)property
: new HttpRequestMessageProperty();
httpRequest.Headers["My-Header"] = "My-Header-Value";
request.Properties[HttpRequestMessageProperty.Name] = httpRequest;
return null;
}
}
实作 IEndpointBehavior
在 ApplyClientBehavior()
之中,将 HttpHeadersMessageInspector
加到 ClientMessageInspectors
集合。
public class HttpHeadersBehavior : IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.ClientMessageInspectors.Add(new HttpHeadersMessageInspector());
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
}
public void Validate(ServiceEndpoint endpoint)
{
}
}
新增 EndpointBehavior
最后,将 HttpHeadersBehavior
新增到 SoapClient Endpoint 的 EndpointBehaviors
集合,这样就可以了。
...
var client = new WebService1SoapClient(WebService1SoapClient.EndpointConfiguration.WebService1Soap);
client.Endpoint.EndpointBehaviors.Add(new HttpHeadersBehavior());
...
执行结果
遵循 WCF 的架构,顺着它的脉络来,加个 Http Header 不必绕远路、更不必修改代理类别,只要掌握讯息拦截与端点行为这两个扩充点,就能在送出 Request 前优雅地塞入所需资讯。以上内容,分享给有遇到类似问题的朋友,希望能够有一丁点的帮助。
相关资源
C# 指南 |
ASP.NET 教学 |
ASP.NET MVC 指引 |
Azure SQL Database 教学 |
SQL Server 教学 |
Xamarin.Forms 教学 |