我通过visual studio连接到WSDL以在c#中构建Web请求,但是在身份验证方面存在问题。我们正在处理的公司要求信息在标题中,但不会通过WSDL公开他们需要的信息,并说,"这个确切的标题需要包含在所有请求中&#34 34。
理论上我只想获得StringBuilder对象中内置的标头并附加到客户端对象,但我无法轻易看到如何做到这一点。我使用的所有东西,比如WCFExtras +,甚至只是System.ServiceModel.Channels.MessageHeader都需要一个对象,值和一个ns(很明显,C#是一个OOPL)。
我尝试过做这样的事情,但我意识到你不能像这样手动添加XML,它会剥离掉<和>到Web安全文本等价物:
using (var client = new productsClient())
{
using (OperationContextScope scope = new OperationContextScope(client.InnerChannel))
{
MessageHeader<string> header = new MessageHeader<string>("wsse:Security", true, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", true);
var untyped = header.GetUntypedHeader(hardcodedHeader, "http://api.xxxcon.com/xxx");
OperationContext.Current.OutgoingMessageHeaders.Add(untyped);
var request = new productRequest();
response = client.getProduct(request);
}
}
也许使用MessageHeader.CreateHeader就是答案?我可以用它来创建一个有一行的简单标题 (以值的形式)但是当我尝试将请求嵌套在一起以创建父子关系时:
var username = System.ServiceModel.Channels.MessageHeader.CreateHeader
("wsse:UsernameToken ", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
, usernameString);
var pw = System.ServiceModel.Channels.MessageHeader.CreateHeader
("wsse:Password", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
, passwordString);
var header1 = System.ServiceModel.Channels.MessageHeader.CreateHeader
("wsse:UsernameToken ", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
, "", username);
但同样,这会引发错误。我怀疑这个类并不意味着像这样嵌套xml对象。
总而言之,我想实际使用WSDL而不必手动生成所有XML,但是当我真的只想说,我似乎受到了面向对象的阻碍, &#34;这是标题,只要相信我,一切都在那里。把这个孩子拍到#34;。
是否有人熟悉在这种情况下该怎么做?先感谢您。