C#访问Java的WebService添加SOAPHeader验证的问题

9 篇文章 0 订阅

首先,要创建一个继承自System.Web.Services.Protocols.SoapHeader的RequestSOAPHeader类,在其中添加UserName和Password两个属性,代码如下:

public class RequestSOAPHeader : System.Web.Services.Protocols. SoapHeader

{

     public string user { get; set; }

     public string password { get; set; }

}

生成的WebService代理类中设置成属性成员:

public partial class ISysNotifyTodoWebServiceService

{

     public RequestSOAPHeader RequestSOAPHeader { get; set; }

}

在访问的WebService方法上方添加SOAPHeader的声明:

[System.Web.Services.Protocols. SoapDocumentMethodAttribute( "", RequestNamespace="http://webservice.notify.sys/" , ResponseNamespace="http://webservice.notify.sys/" , Use=System.Web.Services.Description.SoapBindingUse .Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle .Wrapped)]

[ return: System.Xml.Serialization. XmlElementAttribute( "return", Form=System.Xml.Schema.XmlSchemaForm .Unqualified)]

[ SoapHeader( "RequestSOAPHeader")]

public notifyTodoAppResult setTodoDone([System.Xml.Serialization.XmlElementAttribute (Form=System.Xml.Schema.XmlSchemaForm .Unqualified)] notifyTodoRemoveContext arg0) {

      object[] results = this.Invoke( "setTodoDone", new object[] {

                        arg0});

      return (( notifyTodoAppResult)(results[0]));

}

查OA系统访问文档,才发现SOAPHeader需要放在特殊的命名空间内容,但是因为原WSDL可能因为安全原因就没有任何显式声明,经过一番折腾终于明白如何去改造WebService代理类在报文节点上面加自定义的命名空间和前缀。原报文要求如下:

<RequestSOAPHeader xmlns:tns="http://sys.webservice.client">
     <tns:UserName>
          username
     </tns:UserName>
     <tns:Password>
          password
     </tns:Password>
</RequestSOAPHeader>

将原有报文头对象RequestSOAPHeader更改为:

public class RequestSOAPHeader : System.Web.Services.Protocols. SoapHeader

{

        public RequestSOAPHeader()

        {

            Namespaces = new XmlSerializerNamespaces();

        }

        [ XmlElement(Namespace = "http://sys.webservice.client")]

        public string UserName{ get; set; }

        [ XmlElement(Namespace = "http://sys.webservice.client")]

        public string Password { get; set; }

        [ XmlNamespaceDeclarations]

        public XmlSerializerNamespaces Namespaces { get; set; }

 }

然后在代理类的构造函数中实例化RequestSOAPHeader对象时,将需要的命名空间定义添加到Namespaces中:

RequestSOAPHeader = new OA. RequestSOAPHeader();

RequestSOAPHeader.Namespaces.Add( "tns", "http://sys.webservice.client" );

RequestSOAPHeader.UserName=Settings.Default.ConnectUserName;

RequestSOAPHeader.Password=Settings.Default.ConnectPassword;

改造完毕,然后再进行访问,就会生成如下报文:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值