C#调用Axis2发布的带SoapHeader用户验证的WebService

起因:
合作公司提供了一个WebService供我调用,为了保证安全性,要求在SoapHeader中带用户名和密码进行校验。

在获取了对方的WSDL文件后,并未在文件中指明SoapHeader的格式以及要传递的用户名、密码的属性名称。按照C#中调用WebService的常规方法,在测试工程中“添加Web引用”或“添加服务引用”,只看到生成的*.discomap 和 *.wsdl 两个文件,并未找到生成的 *.cs 类文件,但在测试代码中可以直接调用WebService,未要求身份校验的服务方法可以正常调用,但对于有身份校验要求的方法,则无法设定SoapHeader,导致调用失败。

通过对网上一些案例的研究以及自己的摸索,发现一个解决方法。

步骤:

1、通过命令行,使用wsdl.exe工具手工生成服务接口类文件:

a) 开始菜单--》Microsoft Visual Studio 2010--》Visual Studio Tools--》Visual Studio Command Prompt (2010)

b) C:\*******\VC>wsdl /n:website /out:D:\******\website\InterfaceCls.cs http://XXX.XXX.XXX.XXX:81/axis2/services/InterfaceCls?wsdl
Microsoft(R) Web Services 描述语言实用工具
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
正在写入文件“D:\******\website\InterfaceCls.cs”。

c) 把生成的InterfaceCls.cs文件加入工程,例如:App_Code目录

2、创建自定义SoapHeader文件,性须继承自System.Web.Services.Protocols.SoapHeader。源码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

/// <summary>

///WebsiteSoapHeader

/// </summary>

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

{

private string userName=string.Empty;

private string passWord=string.Empty;

/// <summary>

///

/// </summary>

public WebsiteSoapHeader()

{

}

/// <summary>

///

/// </summary>

/// <param name="userName">用户名</param>

/// <param name="passWord">密码</param>

public WebsiteSoapHeader(string userName, string passWord)

{

this.userName = userName;

this.passWord = passWord;

}

/// <summary>

///

/// </summary>

public string UserName

{

get { return userName; }

set { userName = value; }

}

/// <summary>

///

/// </summary>

public string PassWord

{

get { return passWord; }

set { passWord = value; }

}

}

3、修改InterfaceCls.cs 文件:

a) 增加类变量Authentication:

namespace website {

using System;

using System.Web.Services;

using System.Diagnostics;

using System.Web.Services.Protocols;

using System.ComponentModel;

using System.Xml.Serialization;

/// <remarks/>

[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.1")]

[System.Diagnostics.DebuggerStepThroughAttribute()]

[System.ComponentModel.DesignerCategoryAttribute("code")]

[System.Web.Services.WebServiceBindingAttribute(Name="InterfaceClsSoap11Binding", Namespace="http://ws.apache.org/axis2")]

public partial class InterfaceCls :  System.Web.Services.Protocols.SoapHttpClientProtocol {

private System.Threading.SendOrPostCallback GetBuyHouseInfoOperationCompleted;

private System.Threading.SendOrPostCallback sayHelloOperationCompleted;

public WebsiteSoapHeader Authentication;//这是新增的类变量

/// <remarks/>

public InterfaceCls() {

……

}

}

}

b) 在有身份校验要求的服务方法上增加声明:

/// <remarks/>

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("urn:GetBuyHouseInfo", RequestNamespace="http://ws.apache.org/axis2", ResponseNamespace="http://ws.apache.org/axis2", 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, IsNullable=true)]

[System.Web.Services.Protocols.SoapHeader("Authentication")]  //这是新增的声明,其中Authentication必须与前面的类变量同名

public string GetBuyHouseInfo() {

object[] results = this.Invoke("GetBuyHouseInfo", new object[0]);

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

}

4、在客户端调用时,增加给Authentication 变量的赋值:

/// <summary>

/// 测试通过SoapHeader来访问有用户鉴权的服务

/// </summary>

protected void testCallRemoteService()

{

website.InterfaceCls service = new website.InterfaceCls();

//以下红色部分是新增的代码

WebsiteSoapHeader header = new WebsiteSoapHeader();

header.UserName = "testuser";

header.PassWord = "111111";

service.Authentication = header;   //给Authentication 赋值

string str = service.GetBuyHouseInfo();

}

5、至此,就解决了前面所说的问题。

时间: 2024-10-03 15:03:31

C#调用Axis2发布的带SoapHeader用户验证的WebService的相关文章

HttpClient调用.net发布的带Windows NTML验证的webservice

使用HttpClient调用: 先要通过Windows NTML验证,然后才能调用 . 1 class WebServiceTest 2 { 3 4 /** 5 * 获取接口数据 6 * @param soapRequest 7 * @return String 8 */ 9 public String postSoapRequest(String soapRequest){ 10 CloseableHttpClient httpclient = HttpClients.createDefaul

python2.0_day18_Django自带的用户认证模块的使用

用户验证我们基于一个项目来学习利用Django框架中的user表实现用户认证Django练习小项目:学员管理系统设计开发 项目需求: 1.分讲师\学员\课程顾问角色, 2.学员可以属于多个班级,学员成绩按课程分别统计 3.每个班级至少包含一个或多个讲师 4.一个学员要有状态转化的过程 ,比如未报名前,报名后,毕业老学员 5.客户要有咨询纪录, 后续的定期跟踪纪录也要保存 6.每个学员的所有上课出勤情况\学习成绩都要保存 7.学校可以有分校区,默认每个校区的员工只能查看和管理自己校区的学员 8.客

.net 在不同情况下调用带soapheader的webservice的方式

国庆长假到了,本想出去玩玩,无奈自己屌丝一枚,啥都没有,只能自己宅在家里思考思考人生.不过人生还是过于复杂,一时间也想不出个所以然,只能是整理一下在工作中遇到的一些小问题,首先是关于带soapheader的webservice. 一.webservice大家都用的比较频繁,有时也有一些带soapheader的webservice,首先一种最简单的调用soapheader的情况就是,如果对方的webservice也是用.net写的,可能会是这种方式 [WebMethod] [SoapHeader(

Axis2发布webservice(4)&mdash;webservice的异步调用

一,发布一个webservice,代码如下 package com.hoo.service; public class AsynchronousService { public String execute() throws InterruptedException{ //让当前线程睡眠5钟,展示异步调用 Thread.sleep(5000); return "done"; } } 二.发布Service,参见前面教程,不多讲 三.RPC方式异步调用: import java.io.I

webService总结(四)——使用axis2发布和调用webService

准备工作 Axis2 官网 http://axis.apache.org/  下载axis2相关资料 其中 axis2-1.6.2-bin.zip文件中包含了Axis2中所有的jar文件, axis2-1.6.2-war.zip文件用于将WebService发布到Web容器中.最后两个是axis2在eclipse中的插件. 大概说说这几个文件如何使用. 1.解压axis2-1.6.2-bin.zip到任意目录.然后在eclipse中按下图配置. 2.将axis2-1.6.2-war.zip文件解

Axis2发布webservice(1)--0配置发布

Axis2发布webservice(1)--0配置发布webservice 一. 准备工作 1.下载axis2程序包:   http://axis.apache.org/axis2/java/core/download.cgi      下载时选择Binary Distribution版本的zip格式文件和WAR Distribution的zip格式文件,总共2个zip文件:      axis2-1.6.2-bin.zip:包含axis2是所有jar包,再编程时根据需要将解压后的lib文件夹下

Axis2发布webservice(4)&mdash;WebService的session管理

一.WebService中添加session管理代码,用到了MessageContext类和ServiceContext类.代码如下: package com.hoo.service; import org.apache.axis2.context.MessageContext; import org.apache.axis2.context.ServiceContext; public class LoginService { //登陆方法 public boolean login(Strin

新手Axis2 发布Web Service之路

由于公司的需求,需要写几个银行接口写模拟器(Mock Server),此次接口需要发布成一个WEB Service. 一开始,我以为只要负责写接口的业务层就行了,具体的框架或是环境搭建可以不用管.在与开发沟通完之后,因为本人对Web Service发布也不懂,完全属于没有概念的那种,开发愿意帮忙搭建一个. 在此期间呢,我开始写业务层,把3个接口的业务层花了一天的时间写完了,加了一些数据库查询的方法以及数据库新的字段以满足此次的业务需求. 开发也把WEB Service的一个小Demo做好了,利用

《小猪CMS(PigCms)多用户微信营销服务平台系统V6.1完美破解至尊版带微用户管理CRM+微信支付》

<小猪CMS(PigCms)多用户微信营销服务平台系统V6.1完美破解至尊版带微用户管理CRM+微信支付> 之前发布了不少微赢的多用户微信网站源码,今天为我的小伙伴们准备的是功能非常强悍,最新版小猪CMS(PigCms)多用户微信营销服务平台系统V6.1完美破解至尊版带微用户管理CRM,其功能非常不错的,安装也很简单.目前不少用微信管家的童鞋,估计都知道微信管家几百M的源码,实际上很多都是多余的文件,而且安装起来也是超麻烦.小猪CMS(pigcms)多用户微信营销系统也是个非常棒的选择哦. 这