C# 如何定义要包含在XML请求头中的XML名称空间,该请求将通过Web服务调用的调用发送?
我在VS 2012中开发了一个C#类,我必须通过远程web服务方法HTTPS调用(消费)。我已经应用代码为安全标记创建自定义头,但是我必须在根中应用名称空间声明,如C# 如何定义要包含在XML请求头中的XML名称空间,该请求将通过Web服务调用的调用发送?,c#,xml,web-services,wcf,soap,C#,Xml,Web Services,Wcf,Soap,我在VS 2012中开发了一个C#类,我必须通过远程web服务方法HTTPS调用(消费)。我已经应用代码为安全标记创建自定义头,但是我必须在根中应用名称空间声明,如 xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 必须通过web服务方法调用发送的完整XML请求将如下所示(并已通过SOAP UI成功测试): <?xml version="1.0" en
xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
必须通过web服务方法调用发送的完整XML请求将如下所示(并已通过SOAP UI成功测试):
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<env:Header>
<ns1:Security>
<ns1:UsernameToken>
<ns1:Username>XXXXXXXXXXXXXXXXXXXX</ns1:Username>
<ns1:Password>ZZZZZZZZZZZZZZZZZZZZ</ns1:Password>
</ns1:UsernameToken>
</ns1:Security>
</env:Header>
<env:Body>
<ns:vhWsVersion/>
</env:Body>
</env:Envelope>
必须通过调用web服务方法包含
如有任何帮助,请谅解
编辑
var customBinding = new CustomBinding();
customBinding.Elements.Add(new TextMessageEncodingBindingElement
{
MessageVersion = MessageVersion.Soap11,
WriteEncoding = System.Text.Encoding.UTF8
});
var Uri = new Uri("https://");
var endpointAddres = new EndpointAddress(Uri, new MySecurityHeader());
var client = new ChannelFactory<ServiceReference3.VhWsCreatePayId>(customBinding)
.CreateChannel(endpointAddres);
client.vhWsCreatePayIdVersion(request);
var customBinding=new customBinding();
添加(新的TextMessageEncodingBindingElement
{
MessageVersion=MessageVersion.Soap11,
WriteEncoding=System.Text.Encoding.UTF8
});
var Uri=新Uri(“https://”);
var endpointAddres=newendpointaddress(Uri,new MySecurityHeader());
var client=新的ChannelFactory(customBinding)
.CreateChannel(e)ndpointAddres);
client.vhWsCreatePayIdVersion(请求);
您需要确保http://docs.oasis-open.org/...
命名空间包含在SoapHeader
中,例如
[System.Xml.Serialization.XmlRootAttribute(Namespace =
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
IsNullable = false)]
public partial class UsernameToken : System.Web.Services.Protocols.SoapHeader
{
// Namespace is also available here if different from the root element.
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string Username {get; set;}
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string Password {get; set;}
}
编辑如果您正在使用另一种技术构建
SoapHeader
,请注意oasis
命名空间不一定需要进入根信封
元素-它可以本地放置在标头中,例如:
<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<UsernameToken>
<Username>XXXXXXXXXXXXXXXXXXXX</Username>
<Password>ZZZZZZZZZZZZZZZZZZZZ</Password>
<UsernameToken>
</Security>
XXXXXXXXXXXXXXXXXX
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
当您说您已经为安全标签构建了自定义头时,我假设您继承了内置的SoapHeader
基。如果您正在使用另一种技术来构建Xml,请与我们分享,以便我们提供帮助。很抱歉给您带来麻烦。。。这里是var customBinding=new customBinding();添加(新的TextMessageEncodingBindingElement{MessageVersion=MessageVersion.Soap11,WriteEncoding=System.Text.Encoding.UTF8});var Uri=新Uri(“https://”);var endpointAddres=newendpointaddress(Uri,new MySecurityHeader());var client=newchannelfactory(customBinding).CreateChannel(endpointAddres);client.vhWsCreatePayIdVersion(请求);抱歉-我应该意识到这是一个-我建议你仔细看看。您可能可以直接从配置中配置自定义绑定?
<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<UsernameToken>
<Username>XXXXXXXXXXXXXXXXXXXX</Username>
<Password>ZZZZZZZZZZZZZZZZZZZZ</Password>
<UsernameToken>
</Security>