我正在尝试从我们的C#应用程序调用供应商编写的Java WebService。当通信时,我收到以下消息:
WSDoAllReceiver:传入消息不包含所需的安全标头。
自昨天以来,我一直在尝试找出如何向SOAP消息添加安全标头。
是的,我看过了这个(Clueless about how to create SOAP <wsse:Security> header),但没有起作用。
我四处查找,这似乎是一个相当常见的问题。我想知道是否可以在这里获得一些帮助,一些指针,一些代码,让我开始。
替换
public partial class UserWS : System.Web.Services.Protocols.SoapHttpClientProtocol
由
public partial class UserWS : Microsoft.Web.Services2.WebServicesClientProtocol
设置身份验证信息
UsernameToken token = new UsernameToken("user", "pwd", PasswordOption.SendPlainText);
yourProxy.RequestSoapContext.Security.Tokens.Add(token);
就是这样!顺便提一下,供应商是Blackboard实例。
试试这个方法。无需网络引用和Web.Services2实现。
var client = "Your Service Client";
using (var scope = new OperationContextScope(client.InnerChannel))
{
System.Xml.XmlDocument document = new XmlDocument();
XmlElement element = document.CreateElement("wsse", "UsernameToken",
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
XmlElement newChild = null;
newChild = document.CreateElement("wsse", "Username",
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
newChild.InnerText = "finance";
element.AppendChild(newChild);
newChild = document.CreateElement("wsse", "CorporationCode",
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
newChild.InnerText = "387";
element.AppendChild(newChild);
MessageHeader messageHeader = MessageHeader.CreateHeader("UsernameToken",
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
element, false);
// shouldn't MessageHeader be Security?
// MessageHeader messageHeader = MessageHeader.CreateHeader("Security", ...
OperationContext.Current.OutgoingMessageHeaders.Add(messageHeader);
var result = client.GetCorporations(new CorporationType { pageNo = 1 });
}