在 .Net 的 SOAP 接口中创建 HTTP Header 参数

Creating HTTP Header parameters in a SOAP interface in .Net

你能告诉我如何在 C# 中创建 SOAP HTTP 参数吗?我不是在谈论 SOAP 信封中的 SOAP HEADER,而是 HTTP header。例如,我在下面的 Header 中有用户名和密码:

POST /company/addThing HTTP/1.1
Host: webservices.foo
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.6.2
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Content-Length: 295
Username: userx
Password: passwordy

我可以使用 SoapClient 调用的 stream_context 参数在 PHP 中添加参数,但我找不到在 .Net C# 中执行此操作的位置。

我添加了 Web 参考 WSDL,它自动创建了 Web 服务的 objects 和方法,我对这部分很满意。

如有任何帮助,我们将不胜感激。

编辑

我在下面勾选了答案,但它只适用于 .Net 4.0 及更高版本。我没有提到的一件事是我使用的是 Visual Studio 2008.

我使用的最终解决方案是将以下代码添加到自动生成的 Reference.cs 文件中:

protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
    System.Net.WebRequest request = base.GetWebRequest(uri);
    request.Headers.Add("Username", "user");
    request.Headers.Add("Password", "pass");
    return request;
}

当您从 WSDL 添加 Web 引用时,它会为您生成一个 class,您可以使用它来调用您的服务,我们称它为 "MyService"。如果您为 class 创建一个部分并将其包含在同一个程序集中,您可以覆盖 "GetWebRequest" 方法并直接添加 headers。这是一个例子:

public partial class MyService
{
    private ConcurrentDictionary<string, string> requestHeaders = new ConcurrentDictionary<string, string>();

    public void SetRequestHeader(string headerName, string headerValue)
    {
        this.requestHeaders.AddOrUpdate(headerName, headerValue, (key, oldValue) => headerValue);
    }

    protected override WebRequest GetWebRequest(Uri uri)
    {
        var request = base.GetWebRequest(uri);

        var httpRequest = request as HttpWebRequest;
        if (httpRequest != null)
        {
            foreach (string headerName in this.requestHeaders.Keys)
            {
                httpRequest.Headers[headerName] = this.requestHeaders[headerName];
            }
        }

        return request;
    }
}