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;
 
改造完毕,然后再进行访问,就会生成如下报文:
 
显示发送成功。
 
 
 
 
 
 
 
 
目录
相关文章
|
23天前
|
C#
C# DataTable不能通过已删除的行访问该行的信息
C# DataTable不能通过已删除的行访问该行的信息
|
29天前
|
存储 NoSQL Java
Java数据库编程指南:实现高效数据存储与访问
【4月更文挑战第2天】Java开发者必须掌握数据库编程,尤其是JDBC,它是连接数据库的标准接口。使用Spring JDBC或JPA能简化操作。选择合适的JDBC驱动,如MySQL Connector/J,对性能至关重要。最佳实践包括事务管理、防SQL注入、优化索引和数据库设计。NoSQL数据库如MongoDB也日益重要,Java有对应的驱动支持。理解这些概念和技术是构建高效数据库应用的基础。
Java数据库编程指南:实现高效数据存储与访问
|
2月前
|
存储 canal 算法
[Java·算法·简单] LeetCode 125. 验证回文串 详细解读
[Java·算法·简单] LeetCode 125. 验证回文串 详细解读
23 0
|
2月前
|
JavaScript Java
java生成验证码并进行验证
java生成验证码并进行验证
24 2
|
2天前
|
运维 NoSQL Java
Serverless 应用引擎产品使用之在函数计算上部署Java服务并访问阿里云MongoDB如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
9 0
|
11天前
|
JavaScript 前端开发 C#
C# webbrowser控件设置代理IP访问网站
C# webbrowser控件设置代理IP访问网站
|
12天前
|
安全 Java API
java借助代理ip,解决访问api频繁导致ip被禁的问题
java借助代理ip,解决访问api频繁导致ip被禁的问题
|
14天前
|
存储 NoSQL Java
探索Java分布式锁:在高并发环境下的同步访问实现与优化
【4月更文挑战第17天】Java分布式锁是解决高并发下数据一致性问题的关键技术,通过Redis、ZooKeeper、数据库等方式实现。它确保多节点共享资源时的同步访问,防止数据不一致。优化策略包括锁超时重试、续期、公平性和性能优化。合理设计分布式锁对支撑大规模分布式系统至关重要。
|
14天前
|
Oracle Java 关系型数据库
Java 开发者必备:JDK 版本详解与选择策略(含安装与验证)
Oracle Java SE 支持路线图显示,JDK 8(LTS)支持至2030年,非LTS版本如9-11每6个月发布且支持有限。JDK 11(LTS)支持至2032年,而JDK 17及以上版本现在提供免费商用许可。LTS版本提供长达8年的支持,每2年发布一次。Oracle JDK与OpenJDK有多个社区和公司构建版本,如Adoptium、Amazon Corretto和Azul Zulu,它们在许可证、商业支持和更新方面有所不同。个人选择JDK时,可考虑稳定性、LTS、第三方兼容性和提供商支持。
27 0