[小菜一碟] 如何在 Web Service 代理类别发送 Http Request 前加入自订 Http Header

在之前的一篇文章中,说明了我们如何用 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 教学

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章