C#访问Java的WebService添加SOAPHeader验证的问题
2014-11-12 20:34
585 查看
这两天做与公司OA的接口,发现C#访问Java的WebService需要提供一个SOAP的头验证信息,但是WebService的WSDL中并没有提供约定的验证信息,所以Visual Studio生成的代理类并没有发现这些内容,所以这个SOAPHeader就必须要自己组织,还遇到一个问题就是SOAP头部信息,OA那边还按照不知道什么实例添加了一个根节点没有的命名空间,这就致使SOAPHeader内容一直报传输错误,废话不多说,上两个阶段的示例。
首先,要创建一个继承自System.Web.Services.Protocols.SoapHeader的RequestSOAPHeader类,在其中添加UserName和Password两个属性,代码如下:
[align=left]public class RequestSOAPHeader : System.Web.Services.Protocols. SoapHeader[/align]
[align=left]{[/align]
[align=left] public string user { get; set; }[/align]
[align=left] public string password { get; set; }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]生成的WebService代理类中设置成属性成员:[/align]
[align=left] [/align]
[align=left]public partial class ISysNotifyTodoWebServiceService[/align]
[align=left]{[/align]
[align=left] public RequestSOAPHeader RequestSOAPHeader { get; set; }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]在访问的WebService方法上方添加SOAPHeader的声明:[/align]
[align=left] [/align]
[align=left][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)][/align]
[align=left][ return: System.Xml.Serialization. XmlElementAttribute( "return", Form=System.Xml.Schema.XmlSchemaForm .Unqualified)][/align]
[align=left][ SoapHeader( "RequestSOAPHeader")][/align]
[align=left]public notifyTodoAppResult setTodoDone([System.Xml.Serialization.XmlElementAttribute (Form=System.Xml.Schema.XmlSchemaForm .Unqualified)] notifyTodoRemoveContext arg0) {[/align]
[align=left] object[] results = this.Invoke( "setTodoDone", new object[] {[/align]
[align=left] arg0});[/align]
[align=left] return (( notifyTodoAppResult)(results[0]));[/align]
[align=left]}[/align]
[align=left] [/align]
发送报文截图如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/15/a97582d385e6d2a7f6d000ba2d38bf69.png)
[align=left] [/align]
[align=left] [/align]
[align=left]结果返回用户名密码错误:[/align]
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/15/161f302872c5ec886ed3d901eb1b45d1.png)
[align=left] [/align]
[align=left]查OA系统访问文档,才发现SOAPHeader需要放在特殊的命名空间内容,但是因为原WSDL可能因为安全原因就没有任何显式声明,经过一番折腾终于明白如何去改造WebService代理类在报文节点上面加自定义的命名空间和前缀。原报文要求如下:[/align]
[align=left]<RequestSOAPHeader xmlns:tns="http://sys.webservice.client">
<tns:UserName>
username
</tns:UserName>
<tns:Password>
password
</tns:Password>
</RequestSOAPHeader>[/align]
[align=left]将原有报文头对象RequestSOAPHeader更改为:[/align]
[align=left]public class RequestSOAPHeader : System.Web.Services.Protocols. SoapHeader[/align]
[align=left]{[/align]
[align=left] public RequestSOAPHeader()[/align]
[align=left] {[/align]
[align=left] Namespaces = new XmlSerializerNamespaces();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [ XmlElement(Namespace = "http://sys.webservice.client")][/align]
[align=left] public string UserName{ get; set; }[/align]
[align=left] [/align]
[align=left] [ XmlElement(Namespace = "http://sys.webservice.client")][/align]
[align=left] public string Password { get; set; }[/align]
[align=left] [/align]
[align=left] [ XmlNamespaceDeclarations][/align]
[align=left] public XmlSerializerNamespaces Namespaces { get; set; }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]然后在代理类的构造函数中实例化RequestSOAPHeader对象时,将需要的命名空间定义添加到Namespaces中:[/align]
[align=left] [/align]
[align=left]RequestSOAPHeader = new OA. RequestSOAPHeader();[/align]
[align=left]RequestSOAPHeader.Namespaces.Add( "tns", "http://sys.webservice.client" );[/align]
[align=left]RequestSOAPHeader.UserName=Settings.Default.ConnectUserName;[/align]
[align=left]RequestSOAPHeader.Password=Settings.Default.ConnectPassword;[/align]
[align=left] [/align]
[align=left]改造完毕,然后再进行访问,就会生成如下报文:[/align]
[align=left] [/align]
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/15/1891325a2fba26c99e9420dcb04b0bf2.png)
[align=left]显示发送成功。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
首先,要创建一个继承自System.Web.Services.Protocols.SoapHeader的RequestSOAPHeader类,在其中添加UserName和Password两个属性,代码如下:
[align=left]public class RequestSOAPHeader : System.Web.Services.Protocols. SoapHeader[/align]
[align=left]{[/align]
[align=left] public string user { get; set; }[/align]
[align=left] public string password { get; set; }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]生成的WebService代理类中设置成属性成员:[/align]
[align=left] [/align]
[align=left]public partial class ISysNotifyTodoWebServiceService[/align]
[align=left]{[/align]
[align=left] public RequestSOAPHeader RequestSOAPHeader { get; set; }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]在访问的WebService方法上方添加SOAPHeader的声明:[/align]
[align=left] [/align]
[align=left][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)][/align]
[align=left][ return: System.Xml.Serialization. XmlElementAttribute( "return", Form=System.Xml.Schema.XmlSchemaForm .Unqualified)][/align]
[align=left][ SoapHeader( "RequestSOAPHeader")][/align]
[align=left]public notifyTodoAppResult setTodoDone([System.Xml.Serialization.XmlElementAttribute (Form=System.Xml.Schema.XmlSchemaForm .Unqualified)] notifyTodoRemoveContext arg0) {[/align]
[align=left] object[] results = this.Invoke( "setTodoDone", new object[] {[/align]
[align=left] arg0});[/align]
[align=left] return (( notifyTodoAppResult)(results[0]));[/align]
[align=left]}[/align]
[align=left] [/align]
发送报文截图如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/15/a97582d385e6d2a7f6d000ba2d38bf69.png)
[align=left] [/align]
[align=left] [/align]
[align=left]结果返回用户名密码错误:[/align]
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/15/161f302872c5ec886ed3d901eb1b45d1.png)
[align=left] [/align]
[align=left]查OA系统访问文档,才发现SOAPHeader需要放在特殊的命名空间内容,但是因为原WSDL可能因为安全原因就没有任何显式声明,经过一番折腾终于明白如何去改造WebService代理类在报文节点上面加自定义的命名空间和前缀。原报文要求如下:[/align]
[align=left]<RequestSOAPHeader xmlns:tns="http://sys.webservice.client">
<tns:UserName>
username
</tns:UserName>
<tns:Password>
password
</tns:Password>
</RequestSOAPHeader>[/align]
[align=left]将原有报文头对象RequestSOAPHeader更改为:[/align]
[align=left]public class RequestSOAPHeader : System.Web.Services.Protocols. SoapHeader[/align]
[align=left]{[/align]
[align=left] public RequestSOAPHeader()[/align]
[align=left] {[/align]
[align=left] Namespaces = new XmlSerializerNamespaces();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [ XmlElement(Namespace = "http://sys.webservice.client")][/align]
[align=left] public string UserName{ get; set; }[/align]
[align=left] [/align]
[align=left] [ XmlElement(Namespace = "http://sys.webservice.client")][/align]
[align=left] public string Password { get; set; }[/align]
[align=left] [/align]
[align=left] [ XmlNamespaceDeclarations][/align]
[align=left] public XmlSerializerNamespaces Namespaces { get; set; }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]然后在代理类的构造函数中实例化RequestSOAPHeader对象时,将需要的命名空间定义添加到Namespaces中:[/align]
[align=left] [/align]
[align=left]RequestSOAPHeader = new OA. RequestSOAPHeader();[/align]
[align=left]RequestSOAPHeader.Namespaces.Add( "tns", "http://sys.webservice.client" );[/align]
[align=left]RequestSOAPHeader.UserName=Settings.Default.ConnectUserName;[/align]
[align=left]RequestSOAPHeader.Password=Settings.Default.ConnectPassword;[/align]
[align=left] [/align]
[align=left]改造完毕,然后再进行访问,就会生成如下报文:[/align]
[align=left] [/align]
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/15/1891325a2fba26c99e9420dcb04b0bf2.png)
[align=left]显示发送成功。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
相关文章推荐
- C#访问Java的WebService添加SOAPHeader验证的问题
- C#访问Java的WebService添加Header验证的问题
- C# 调用WebService 时 soapheader验证问题!
- # C# 调用java的WebService添加SOAPHeader验证
- C#访问WebService需要SOAPHeader验证的方法
- axis1.0+带证书验证方式访问webservice的问题
- 关于java中Axis2客户端调用C#webservice服务端包含Cookie问题
- java 中用Axis访问C#的webservice接口
- Java和C#访问同一个数据库遇到的一些问题
- 用C#.NET调用Java开发的WebService传递int,double问题,出现java无法获 3ff0
- 使用SoapHeader实现对WebService的访问验证
- 用C#.NET调用Java开发的WebService传递int,double问题,出现java无法获得值!
- C++,C#,JAVA之间webservice互操作问题探讨
- 求救:C# 调用JAVA写的WEBSERVICE的问题!
- C#调用Axis2发布的带SoapHeader用户验证的WebService
- 用C#.NET调用Java开发的WebService传递int,double问题,出现java无法获得值!
- java axis 1.4访问c# webservice,并获取返回值为dataset
- c#调用java写的webservice数据丢失有关问题
- Java调用带SoapHeader头验证的.net Webservice示例代码
- C# 调用JAVA(使用axis)开发的webservice 提示错误的问题