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;

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

显示发送成功。

时间: 2024-11-04 13:27:51

C#访问Java的WebService添加SOAPHeader验证的问题的相关文章

.net 客户端调用java或.net webservice进行soapheader验证

最近项目中有业务需要跨平台调用web服务,客户端和服务器之间采用非对称加密来保证数据的安全性,webservice的安全验证基于soapheader. 借此机会,顺便整理一下调用.net webservice 和 java webservice 的验证方式,记录下来. .net端web服务 1.若web服务是采用.net webservice实现,如下代码: /// </summary> [WebService(Namespace = "http://tempuri.org/&quo

C#访问WebService需要SOAPHeader验证的方法

这周在做一个项目需要向外部单位的一个平台推送信息,对方平台是JAVA平台开发,需要提供一个SOAP的header  合法性验证信息,否则接口返回的信息是header 为空. 谈谈我的这一周的经验总结: 第一步:生成WSDL的代理类,不要用WEB 引用的方法去调用接口. 怎么生成WSDL的代理类呢? 菜单:工具 ==>外部工具 命令行:C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\wsdl.exe

ANDROID调用webservice带soapheader验证

最近的一个项目中调用webservice接口,需要验证soapheader,现将解决方法记录如下:(网上资料出处太多,就不做引用,原作者如看到,如有必要添加请通知) 1.先看接口 POST /webserver/ValideWebService.asmx HTTP/1.1 Host: IP地址 Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://命名空间/Login" <

C#静态调用带有SoapHeader验证的WebServices

转自:http://blog.csdn.net/u012995964/article/details/54562111 本文记录带有SoapHeader验证的WebServices服务创建.部署及C#中的静态调用方法,基于 Windows8.1.Visual Studio 2013.IIS8 环境实现. WebServices服务创建 Visual Studio 2013中创建WebServices 创建一个空的 ASP.NET Web 应用程序 : 创建 WebService 服务的程序(as

WebService 之 身份验证

在项目开发,我们经常会使用WebService,但在使用WebService时我们经常会考虑到了WebService是安全问题,很容易想到通过一组用户名与密码来防止非法用户的调用 . 一.NetworkCredential方式 在 System.Net 命名空间中提供了一个NetworkCredential,通过它我们可以在网络中提供一个凭证,只有获得该凭证的用户才能访问相应的服务的权限.在NetworkCredential 中,我们通过提供WebService发布所在的服务器名称,以及登录服务

Java创建WebService服务及客户端实现(转)

简介 WebService是一种服务的提供方式,通过WebService,不同应用间相互间调用变的很方便,网络上有很多常用的WebService服务,如:http://developer.51cto.com/art/200908/147125.htm,不同的语言平台对WebService都有实现,Java的WebService实现,比较流行的有Axis2.Jaxws,本文介绍的是Axis2. Axis2下载和部署 Axis2是Apache开发的一个开源项目,再次感叹Apache的伟大! 下载地址

java的WebService实践(cxf)

Java发布WebService,结合Spring,通过cxf的方式 难点:1.引用什么jar包: 1.创建接口 源码如下: package com.nankang; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface HelloWorld { String sayHi(@WebParam(name="text") String text); } 2.实现接口 源码如下

C++与Java通过WebService通信(上)

一. 前言 本篇讲述如果通过C++客户端访问Java服务端发布的SOAP模式的WebService接口.文档中的样例代码拷贝出去即可运行,所有的代码都是本地测试OK的:本文不但解决了接口调用的问题,同时解决了中文乱码的问题. 二. 环境准备 1. CXF组件:Java端用于发布WebService服务的开源组件,内部自带jetty Web容器. 2. Gsoap组件:C++端用户访问WebService服务的组件.使用的是gsoap-2.8.这两个组件可以直接google,官网下载. 3. Ec

java创建webservice client

java的webservice实现有多种方式,可用的工具也有一些.之前对这块的只是比较缺乏,以至于一上来就一直看spring webservice.花费了几天后发现和要用的功能不符,就··· 当前学习的需求是webservice client.因此整篇文章用来说明java webserviceclient的创建过程. 首先使用java自带的soapconnection实现.那首先具体的client访问流程为 SOAPConnection connection = null; try { SOAP