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

简介: 原文:C#访问Java的WebService添加SOAPHeader验证的问题这两天做与公司OA的接口,发现C#访问Java的WebService需要提供一个SOAP的头验证信息,但是WebService的WSDL中并没有提供约定的验证信息,所以Visual Studio生成的代理类并没有发现这些内容,所以这个SOAPHeader就必须要自己组织,还遇到一个问题就是SOAP头部信息,OA那边还按照不知道什么实例添加了一个根节点没有的命名空间,这就致使SOAPHeader内容一直报传输错误,废话不多说,上两个阶段的示例。
原文: C#访问Java的WebService添加SOAPHeader验证的问题

这两天做与公司OA的接口,发现C#访问Java的WebService需要提供一个SOAP的头验证信息,但是WebService的WSDL中并没有提供约定的验证信息,所以Visual Studio生成的代理类并没有发现这些内容,所以这个SOAPHeader就必须要自己组织,还遇到一个问题就是SOAP头部信息,OA那边还按照不知道什么实例添加了一个根节点没有的命名空间,这就致使SOAPHeader内容一直报传输错误,废话不多说,上两个阶段的示例。
 
首先,要创建一个继承自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;
 
改造完毕,然后再进行访问,就会生成如下报文:
 
显示发送成功。
 
 
 
 
 
 
 
 
目录
相关文章
|
2月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
391 5
|
4月前
|
存储 安全 Java
java: 无法访问org.springframework.ldap.core.LdapTemplate
java: 无法访问org.springframework.ldap.core.LdapTemplate
163 9
|
6月前
|
缓存 Java 数据库
Java 访问修饰符使用方法与组件封装方法详细说明
本文详细介绍了Java中访问修饰符(`public`、`private`、`protected`、默认)的使用方法,并结合代码示例讲解了组件封装的核心思想与实现技巧。内容涵盖数据封装、继承扩展、模块化设计与接口隔离等关键技术点,帮助开发者提升代码的可维护性与安全性,适用于Java初学者及进阶开发者学习参考。
157 1
|
9月前
|
存储 算法 安全
Java对象创建和访问
Java对象创建过程包括类加载检查、内存分配(指针碰撞或空闲列表)、内存初始化、对象头设置及初始化方法执行。访问方式有句柄和直接指针两种,前者稳定但需额外定位,后者速度快。对象创建涉及并发安全、垃圾回收等机制。
135 0
Java对象创建和访问
|
11月前
|
NoSQL JavaScript 前端开发
Java访问MongoDB
Java访问MongoDB
179 21
|
11月前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
1983 1
|
开发框架 Java .NET
C#与Java
在动态且不断发展的软件开发世界中,Java 和 C# 是两个巨头,每个都有自己独特的优势、理念和生态系统。本文深入比较了 Java 和 C#,探讨了它们的历史背景、语言特性、性能指标、跨平台功能等。
438 19
C#与Java
|
开发框架 监控 .NET
C#进阶-ASP.NET WebForms调用ASMX的WebService接口
通过本文的介绍,希望您能深入理解并掌握ASP.NET WebForms中调用ASMX WebService接口的方法和技巧,并在实际项目中灵活运用这些技术,提高开发效率和应用性能。
805 5
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
265 3