C#调用Axis2发布的带SoapHeader用户验证的WebService
环境: 提供的服务是Axis2开发的,我方用C#调用,开发环境是VS2010
起因:
合作公司提供了一个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、至此,就解决了前面所说的问题。
相关推荐
本文将详细讲解如何使用Axis2来发布Web服务以及如何生成客户端代码来调用这些服务。 首先,让我们了解发布Web服务的过程: 1. **创建WebService**:在Axis2中,可以通过编写一个简单的Java类并暴露其方法作为Web...
总之,Java Webservice Axis2 Client的开发涉及到生成客户端代码、设置SOAP Header、调用服务和处理响应等多个步骤。了解这些概念和API对于构建安全、可靠的Web服务客户端至关重要。在实际项目中,确保遵循最佳实践...
标题“Axis2教程和java调用webservice的各种方法总结”表明了本文档主要聚焦于两个核心内容:一是Axis2框架的使用教程,二是Java语言调用Web服务的不同方法的综合概述。 描述中的“Axis2教程”暗示了会详细讲解Axis...
C# 调用 Java 发布的 WebService 终稿 C# 调用 Java 发布的 WebService 是一种常见的跨语言通信方式。在本文中,我们将介绍如何使用 C# 调用 Java 发布的 WebService。 标题解释 C# 调用 Java 发布的 WebService ...
Java和Axis2是开发Web服务客户端的重要工具,用于调用基于SOAP协议的Web服务。本文将深入探讨如何利用Java和Axis2库来实现这一功能,同时结合提供的代码示例进行详细解析。 首先,Web服务是一种通过网络进行通信的...
axis2客户端调用axis1服务接口 调用方式 使用RPC方式调用WebService,为了防止冲突可以增加 // 与weblogic的lib冲突配置 System.setProperty("javax.xml.stream.XMLInputFactory", ...
在这种情况下,Axis作为一个成熟的SOAP客户端框架,可以帮助Java开发者实现对C# WebService的调用。本文将详细讲解如何使用Java Axis库来调用C# WebService,并介绍所需的jar包。 首先,理解Java Axis的基本概念是...
按回车,网页能正常打开并且加载xml文档,表示webservice发布成功! use项目 描述了axis2如何调用webservice,jar齐全,首先保证webservice的url能正常访问,下载资源后直接运 行com.axis2.test.TestAxis2的main...
描述中提到的“简单例子:axis2整合spring发布webservice”,意味着我们将学习如何将这两个框架结合,以便通过Spring来管理和控制Web服务的生命周期,同时利用Axis2的Web服务处理能力。此外,“以及session的管理”...
AXIS2远程调用WebService是Java开发者在进行分布式服务交互时常用的一种技术。本文将详细介绍如何使用Eclipse集成开发环境和AXIS2框架创建并调用WebService。首先,我们需要准备以下基础工具: 1. Eclipse IDE:这...
总结来说,Spring集成Axis2实现Web服务涉及到Spring的IoC容器、服务的创建和发布、以及客户端的调用等多个环节。了解并掌握这些知识点,对于开发高质量的Web服务应用至关重要。在实际项目中,务必确保所有必要的库...
用AXIS2作为客户端调用webService的demo:本人亲测可用,eclipse工程java项目包含完整代码和完整jar包, 只要用eclipse导入项目即可,运行控制台显示success或者false字符串,说明OK。
本文将深入探讨如何使用Axis2客户端调用WebService接口,并且会特别关注如何精简所需的jar包。 首先,了解Axis2客户端的基本概念是至关重要的。Axis2客户端是用于与远程Web服务交互的工具,它允许开发者通过SOAP...
axis2例子 webservice axis2 示例axis2例子 webservice axis2 示例axis2例子 webservice axis2 示例axis2例子 webservice axis2 示例axis2例子 webservice axis2 示例
当涉及到“axis2客户端调用服务端,带用户身份认证”时,我们主要关注的是如何在 Axis2 客户端中添加安全机制,确保只有经过验证的用户能够访问服务。 首先,理解身份认证是网络安全的基础。在Web服务中,通常采用...
二、利用axis2发布服务 2.1 用java建一个简单的工程sayHi,在里面编写一个简单的服务类sayHi,里面有一个函数sayHello. package Hi; publicclass sayHi { public String sayHello(String user,String weather) { ...
Axis2 使用方法 - Java+WebService Axis2 是一套崭新的 WebService 引擎,该版本是对 Axis1.x 重新设计的产物。...使用 Axis2 可以轻松地开发和发布 WebService,并且可以使用 Java 和 C# 等语言调用 WebService。
- 服务发布后,可以通过Axis2的wsdl2java工具,根据服务的WSDL(Web Service Description Language)文件生成客户端所需的Java类(stubs)。 - 这些类将封装调用Web Service的具体方法,简化了调用流程。 4. **...