在 .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;
}
}
你能告诉我如何在 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;
}
}