在 C# 中为 Web 服务调用添加自定义 SOAPHeader
本文关键字:添加 自定义 SOAPHeader 调用 服务 中为 Web | 更新日期: 2023-09-27 18:32:45
在调用 Web 服务之前,我正在尝试在 c# 中添加自定义 soap 标头信息。我正在使用 SOAP 标头类来完成此操作。我可以部分地做到这一点,但不能完全按照我需要的方式做到这一点。这是我需要肥皂标题的外观
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<UsernameToken>
<Username>USERID</Username>
<Password>PASSWORD</Password>
</UsernameToken>
</Security>
</soap:Header>
<soap:Body>
...
我可以添加肥皂标题,如下所示
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
<UsernameToken xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<Username>UserID</Username>
<Password>Test</Password>
</UsernameToken>
</soap:Header>
<soap:Body>
我无法做的是添加"安全"元素,该元素包装"用户名令牌",如第一个示例所示。任何帮助将不胜感激。
这个添加肥皂标题的链接对我有用。 我正在调用一个不是我编写且无法控制的 SOAP 1.1 服务。 我使用的是VS 2012,并将该服务作为Web参考添加到我的项目中。 希望这有帮助
我按照J. Dudgeon的帖子到线程底部的步骤1-5
。下面是一些示例代码(这将位于单独的.cs文件中):
namespace SAME_NAMESPACE_AS_PROXY_CLASS
{
// This is needed since the web service must have the username and pwd passed in a custom SOAP header, apparently
public partial class MyService : System.Web.Services.Protocols.SoapHttpClientProtocol
{
public Creds credHeader; // will hold the creds that are passed in the SOAP Header
}
[XmlRoot(Namespace = "http://cnn.com/xy")] // your service's namespace goes in quotes
public class Creds : SoapHeader
{
public string Username;
public string Password;
}
}
然后在生成的代理类中,在调用服务的方法上,按照 J Dudgeon 的步骤 4 添加此属性:[SoapHeader("credHeader", Direction = SoapHeaderDirection.In)]
最后,下面是对生成的代理方法的调用,带有标头:
using (MyService client = new MyService())
{
client.credHeader = new Creds();
client.credHeader.Username = "username";
client.credHeader.Password = "pwd";
rResponse = client.MyProxyMethodHere();
}