`

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

 
阅读更多

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发布webservice和调用axis2服务接口

    本文将详细讲解如何使用Axis2来发布Web服务以及如何生成客户端代码来调用这些服务。 首先,让我们了解发布Web服务的过程: 1. **创建WebService**:在Axis2中,可以通过编写一个简单的Java类并暴露其方法作为Web...

    Java Webservice Axis2 Client(含soapheader验证)

    总之,Java Webservice Axis2 Client的开发涉及到生成客户端代码、设置SOAP Header、调用服务和处理响应等多个步骤。了解这些概念和API对于构建安全、可靠的Web服务客户端至关重要。在实际项目中,确保遵循最佳实践...

    Axis2教程和java调用webservice的各种方法总结

    标题“Axis2教程和java调用webservice的各种方法总结”表明了本文档主要聚焦于两个核心内容:一是Axis2框架的使用教程,二是Java语言调用Web服务的不同方法的综合概述。 描述中的“Axis2教程”暗示了会详细讲解Axis...

    C#调用java发布的WebService终稿.pdf

    C# 调用 Java 发布的 WebService 终稿 C# 调用 Java 发布的 WebService 是一种常见的跨语言通信方式。在本文中,我们将介绍如何使用 C# 调用 Java 发布的 WebService。 标题解释 C# 调用 Java 发布的 WebService ...

    Java+Axis2调用Web Services 网络接口

    Java和Axis2是开发Web服务客户端的重要工具,用于调用基于SOAP协议的Web服务。本文将深入探讨如何利用Java和Axis2库来实现这一功能,同时结合提供的代码示例进行详细解析。 首先,Web服务是一种通过网络进行通信的...

    axis2客户端调用axis1服务接口

    axis2客户端调用axis1服务接口 调用方式 使用RPC方式调用WebService,为了防止冲突可以增加 // 与weblogic的lib冲突配置 System.setProperty("javax.xml.stream.XMLInputFactory", ...

    java axis 调用C# webService所需的jar包

    在这种情况下,Axis作为一个成熟的SOAP客户端框架,可以帮助Java开发者实现对C# WebService的调用。本文将详细讲解如何使用Java Axis库来调用C# WebService,并介绍所需的jar包。 首先,理解Java Axis的基本概念是...

    Axis2发布和调用webservice

    按回车,网页能正常打开并且加载xml文档,表示webservice发布成功! use项目 描述了axis2如何调用webservice,jar齐全,首先保证webservice的url能正常访问,下载资源后直接运 行com.axis2.test.TestAxis2的main...

    axis2+spring webservice

    描述中提到的“简单例子:axis2整合spring发布webservice”,意味着我们将学习如何将这两个框架结合,以便通过Spring来管理和控制Web服务的生命周期,同时利用Axis2的Web服务处理能力。此外,“以及session的管理”...

    AXIS2远程调用WebService示例(Eclipse+AXIS2)工具和所用包.rar

    AXIS2远程调用WebService是Java开发者在进行分布式服务交互时常用的一种技术。本文将详细介绍如何使用Eclipse集成开发环境和AXIS2框架创建并调用WebService。首先,我们需要准备以下基础工具: 1. Eclipse IDE:这...

    Spring集成axis2实现webservice所用到的包

    总结来说,Spring集成Axis2实现Web服务涉及到Spring的IoC容器、服务的创建和发布、以及客户端的调用等多个环节。了解并掌握这些知识点,对于开发高质量的Web服务应用至关重要。在实际项目中,务必确保所有必要的库...

    AXIS2作为客户端调用webService的demo

    用AXIS2作为客户端调用webService的demo:本人亲测可用,eclipse工程java项目包含完整代码和完整jar包, 只要用eclipse导入项目即可,运行控制台显示success或者false字符串,说明OK。

    axis2客户端调用webService接口,精简jar包

    本文将深入探讨如何使用Axis2客户端调用WebService接口,并且会特别关注如何精简所需的jar包。 首先,了解Axis2客户端的基本概念是至关重要的。Axis2客户端是用于与远程Web服务交互的工具,它允许开发者通过SOAP...

    axis2例子 webservice axis2 示例

    axis2例子 webservice axis2 示例axis2例子 webservice axis2 示例axis2例子 webservice axis2 示例axis2例子 webservice axis2 示例axis2例子 webservice axis2 示例

    axis2客户端调用服务端,带用户身份认证

    当涉及到“axis2客户端调用服务端,带用户身份认证”时,我们主要关注的是如何在 Axis2 客户端中添加安全机制,确保只有经过验证的用户能够访问服务。 首先,理解身份认证是网络安全的基础。在Web服务中,通常采用...

    php调用Java axis2发布的webservice

    二、利用axis2发布服务 2.1 用java建一个简单的工程sayHi,在里面编写一个简单的服务类sayHi,里面有一个函数sayHello. package Hi; publicclass sayHi { public String sayHello(String user,String weather) { ...

    axis2使用方法-java+webservice

    Axis2 使用方法 - Java+WebService Axis2 是一套崭新的 WebService 引擎,该版本是对 Axis1.x 重新设计的产物。...使用 Axis2 可以轻松地开发和发布 WebService,并且可以使用 Java 和 C# 等语言调用 WebService。

    Android axis调用Webservice

    - 服务发布后,可以通过Axis2的wsdl2java工具,根据服务的WSDL(Web Service Description Language)文件生成客户端所需的Java类(stubs)。 - 这些类将封装调用Web Service的具体方法,简化了调用流程。 4. **...

Global site tag (gtag.js) - Google Analytics