65.9K
CodeProject 正在变化。 阅读更多。
Home

如何使用 C# 在 ASP.NET 中调用 Java Web 服务

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.87/5 (35投票s)

2009年1月7日

CPOL

10分钟阅读

viewsIcon

325803

downloadIcon

3844

Web 服务互操作性

目录

背景

根据 W3C

Web 服务是一种软件系统,旨在支持网络上可互操作的机器对机器交互。

  1. 它具有一种以机器可处理的格式(特别是 WSDL)描述的接口。
  2. 其他系统通过 SOAP 消息与 Web 服务进行交互,其方式由其描述规定,通常通过 HTTP、XML 序列化以及其他 Web 标准来传递。

Web 服务的特性

  1. Web 服务在任何网络(互联网或私有内联网)上运行,以完成特定的任务。
  2. Web 服务执行的任务是其他应用程序可以调用和使用的操作或函数。
  3. Web 服务请求/响应可以在不同业务的不同计算机上的不同应用程序之间发送/接收。

Web 服务包含三个基本组成部分:

  1. 查找服务并注册兴趣的机制
  2. 服务输入和输出参数的定义
  3. 访问服务的传输机制

Web 服务还包括可用于提供其他功能(如安全性、事务处理等)的技术。

Web 服务互操作性

Web 服务的大部分潜力在于其在异构系统、平台、应用程序和编程语言之间实现无缝互操作性的能力。互操作性是 Web 服务的主要目标。然而,这并非必然。Web 服务标准促进互操作性,但不能保证互操作性。要实现完全的互操作性,需要解决许多考虑因素和问题。随着规范的扩展以填补空白,互操作性挑战也随之增加。

一个 Web 服务有许多潜在的客户端,这些客户端可以使用各种库和提供商进行连接。服务本身也可以成为其他服务的客户端。确保基于不同标准实现的客户端能够与服务互操作,对于服务的成功至关重要。

本文的主要目标是演示如何创建 Java Web 服务并从 ASP.NET (C#) 应用程序调用它。

在这里,我们将使用 Java Web 服务 `JSimpCalcWebService` 开发简单的数学函数,如加法、减法等。然后,我们将演示如何通过 ASP.NET 和 C# (`JSimpCalcWebServiceWebSite`) 调用这些 Web 服务方法。要创建这两个独立的应用程序,我们需要使用两个 IDE。在此示例中,我们使用 **NetBeans 6** 进行 Java Web 服务开发,使用 **Visual Studio 2008** 进行调用 Web 服务的 ASP.NET Web 服务客户端。

创建 Java Web 服务

NetBeans 6 提供了一种非常简单方便的方式来开发 Web 服务。使用它开发 Web 服务涉及几个步骤。这些步骤可以总结如下:

  1. 创建 Web 应用程序项目
  2. 将 Web 服务添加到项目中
  3. 为 Web 服务添加操作
  4. 实现 Web 方法
  5. 部署和测试 Web 服务

第一步:创建 Web 应用程序项目

  1. 启动 NetBeans IDE;在“文件”菜单下找到“新建项目”。“新建项目”向导将打开。
  2. 在“类别”选项中选择“Web”,在“项目”部分选择“Web 应用程序”,然后按“下一步”按钮。

    Invoke_Java_WS_In_CS/01.CreateWebServiceNetbeansChooseWebAppProject.png

    图一:新建项目第一步
  3. 在下一个屏幕上,输入项目名称,选择项目位置。我们还可以指定要部署 Web 应用程序的服务器名称,也可以更改默认的上下文路径。

    在这里,我们指定的项目名称为 `JSimpCalcWebService`,并将上下文路径保持与项目名称相同。我们使用 **GlassFish V2** 应用服务器进行部署。

    Create Web Service Netbeans Project
    图二:新建项目第二步
  4. 现在,单击“完成”按钮。

第二步:将 Web 服务添加到项目中

  1. 在“项目”浏览器窗口中右键单击项目名称。

    Create Web Service Netbeans Menu

    图三:Web 服务菜单选项
  2. 从上下文菜单选项中,选择“Web 服务”菜单。将打开一个 Web 服务对话框。

    Create Web Service Netbeans Web Serice Name

    图四:添加新 Web 服务
  3. 在此处输入 Web 服务名称和包名称,如下图所示,然后单击“完成”按钮。

    在我们的示例中,Web 服务名称为 `JSimpCalcWebService`,包名称为 `calc.ws`。

第三步:为 Web 服务添加操作

在将 Web 服务添加到我们的应用程序后,现在是时候添加 Web 服务操作或 `WebMethod` 了。我们可以通过两种方式进行:一种是通过设计模式,另一种是通过源代码模式。在我们的示例中,我们使用设计模式以最简单的方式创建 `WebMethod` 的骨架。

Create Web Service Netbeans WS Add Operation Button

图五:为 Web 服务添加操作
  1. 从图五的突出显示部分可以看到,我们可以通过单击“添加操作”按钮来添加 Web 服务操作。它将打开一个“添加操作”对话框。请参考图六。

    Create Web Service Netbeans WS Add Operation

    图六:为 Web 操作添加参数
  2. 在“添加操作”对话框中,我们必须输入名称(实际上是 `WebMethod` 的名称)。
  3. 我们还可以输入参数名称及其类型(这些参数称为 `WebParam`)。

    在图六中,我们将 `WebMethod` 名称设置为 `addition`,其返回类型为 `java.lang.String`,它接受两个类型为 `double` 的参数(`parameter1` 和 `parameter2`)。同样,我们也创建了其他操作,如 `subtraction`、`multiplication`、`division`、`power`、`maximum`、`minimum`。

第四步:实现 Web 方法

完成第三步后,我们的 Web 服务的基本结构应该已准备就绪。然后,我们从设计模式切换到源代码模式,如图七所示,以完成其余的实现。

Create Web Service Netbeans WS Source Mode

图七:编写 Web 服务代码

代码应如下所示:

package calc.ws;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import calc.util.NumberFormater;

/**
 * @author Bikash Shaw
 */
@WebService()
public class JSimpCalcWebService {

/**
     * Web service operation
     */
    @WebMethod(operationName = "addition")
    public String addition(@WebParam(name = "parameter1")
    double parameter1, @WebParam(name = "parameter2")
    double parameter2) {
        //TODO write your implementation code here:
        return NumberFormater.format((parameter1 + parameter2),0,6);
    }

/**
     * Web service operation
     */
    @WebMethod(operationName = "subtraction")
    public String subtraction(@WebParam(name = "parameter1")
    double parameter1, @WebParam(name = "parameter2")
    double parameter2) {
        //TODO write your implementation code here:
        return NumberFormater.format((parameter1 - parameter2),0,6);
    }

/**
     * Web service operation
     */
    @WebMethod(operationName = "multiplication")
    public String multiplication(@WebParam(name = "parameter1")
    double parameter1, @WebParam(name = "parameter2")
    double parameter2) {
        //TODO write your implementation code here:
        return NumberFormater.format((parameter1 * parameter2),0,6);
    }

/**
     * Web service operation
     */
    @WebMethod(operationName = "division")
    public String division(@WebParam(name = "parameter1")
    double parameter1, @WebParam(name = "parameter2")
    double parameter2) {
        //TODO write your implementation code here:
        return NumberFormater.format((parameter1 / parameter2),0,6);
    }

/**
     * Web service operation
     */
    @WebMethod(operationName = "power")
    public String power(@WebParam(name = "parameter1")
    double parameter1, @WebParam(name = "parameter2")
    double parameter2) {
        //TODO write your implementation code here:
        return NumberFormater.format(Math.pow(parameter1, parameter2),0,6);
    }

/**
     * Web service operation
     */
    @WebMethod(operationName = "maximum")
    public String maximum(@WebParam(name = "parameter1")
    double parameter1, @WebParam(name = "parameter2")
    double parameter2) {
        //TODO write your implementation code here:
        return NumberFormater.format(Math.max(parameter1, parameter2),0,6);
    }

/**
     * Web service operation
     */
    @WebMethod(operationName = "minimum")
    public String minimum(@WebParam(name = "parameter1")
    double parameter1, @WebParam(name = "parameter2")
    double parameter2) {
        //TODO write your implementation code here:
        return NumberFormater.format(Math.min(parameter1, parameter2),0,6);
    }
} 
源代码一:Java JSimpCalcWebService.java Web 服务源代码

在这里,我们使用 `NumberFormater.format(double number, int minFractionDigits,`

`int maxFractionDigits)` 方法将 `double` 值格式化为 `java.lang.String`,最多保留六位小数。请参考源代码二。

package calc.util;

import java.text.NumberFormat;

/**
 * @author Bikash Shaw
 */
public class NumberFormater {

    public static String format(double number, int minFractionDigits,
            int maxFractionDigits) {
        NumberFormat format = NumberFormat.getInstance();
        format.setMaximumFractionDigits(maxFractionDigits);
        format.setMinimumFractionDigits(minFractionDigits);
        return format.format(number);
    }
}
源代码二:NumberFormater.java 源代码

第五步:部署和测试 Web 服务

现在我们的 Web 服务已准备好进行部署和测试。使用 NetBeans 6,只需几个步骤即可完成。首先,确保 GlassFish 服务器正在运行。要启动服务器,我们需要执行以下步骤:

  1. 转到“服务”浏览器窗口。
  2. 展开“服务器”节点。
  3. 右键单击服务器名称(在我们的例子中是 GlassFish V2)。将弹出上下文菜单。
  4. 从菜单选项中选择“启动”。

Create Web Service Netbeans Start Up Server

图八:启动 GlassFish V2 应用服务器

现在,当我们的服务器运行时,就可以部署应用程序并测试我们开发的 Web 服务了。NetBeans 通过几次鼠标点击即可为我们完成部署,步骤如下:

  1. 转到“项目”浏览器窗口。
  2. 展开“Web 服务”节点。
  3. 右键单击 Web 服务名称(在我们的例子中是 `JSimpCalcWebService`)。将弹出上下文菜单。
  4. 单击“测试 Web 服务”菜单。

Create Web Service Netbeans Test Web Service

图九:测试 Web 服务

上述步骤将部署应用程序并启动默认浏览器,您可以在其中通过 SOAP 请求和响应测试 Web 服务。请参考图十的示例输出。我们还可以通过单击超链接来查看 WSDL(Web 服务描述语言)文件。

Create Web Service Netbeans Web Service Tester

图十:测试 Web 服务

或者,我们可以通过 GlassFish 应用服务器的管理控制台来测试 Web 服务并查看其 WSDL 文档,如图十一所示。

Create Web Service Admin Consol Web Service Tester

图十一:通过管理控制台测试 Web 服务

单击“查看 WSDL”链接后,我们可以看到描述我们 Web 服务的 XML 文件。WSDL 文件应如下图十二所示。

Create Web Service WSDL File

图十二:WSDL 文件

地址栏中显示的 URL 将需要用于调用 Web 服务。我们将在创建 ASP.NET 应用程序时演示其用法。

使用 C# 创建 ASP.NET Web 站点

现在,我们的 Web 服务已准备好从非 Java 的开发平台调用。在本文中,我们开发了一个示例 ASP.NET 客户端。使用 Visual Studio 2008,可以通过几个步骤实现,这些步骤可以总结如下:

  1. 创建 ASP.NET Web 站点。
  2. 添加 Web 引用。
  3. 编写代码调用 Web 服务。
  4. 测试 Web 服务客户端应用程序。

第一步:创建 ASP.NET Web 站点

  1. 启动 Visual Studio 2008;在“文件”菜单下选择“新建”→“Web 站点…”。

    Create Web Service Client New Web Site Window

    图十三:新建 Web 站点窗口
  2. 选择“ASP.NET Web 站点”。
  3. 选择要创建 Web 站点的文件夹。在我们的例子中,是 `JSimpCalcWebServiceWebSite`。
  4. 选择语言为 Visual C#,然后单击“确定”按钮。

第二步:添加 Web 引用

现在我们需要在我们的 Web 站点中指定 WSDL 文件。要添加 Web 服务引用,我们必须执行以下步骤:

  1. 转到“解决方案资源管理器”窗口。
  2. 右键单击项目名称(在我们的例子中是 `JSimpCalcWebServiceWebSite`)。将弹出上下文菜单。
  3. 单击“添加 Web 引用”菜单。“添加 Web 引用”对话框将打开。

    Create Web Service Client Add Web Reference context menu

    图十四:添加 Web 引用上下文菜单
  4. 从我们的 Web 浏览器的地址栏(参考图十二)复制 WSDL URL,并粘贴到“添加 Web 引用”对话框的地址栏中,然后按“转到”按钮(参考图十五)。

    Create Web Service Client Add Web Reference context menu

    图十五:添加 Web 引用对话框
  5. 我们可以看到我们 Web 服务的所有方法名称。为 Web 引用命名(在此示例中为 `JSimpCalcWebService`),然后单击“**添加引用**”按钮。

第三步:编写代码调用 Web 服务

使用 C#,只需几行代码即可非常轻松地调用 Web 服务。

  1. 我们首先设计一个 ASP.NET 页面。默认文件名是 `Default.aspx`(源代码包含在 zip 文件中)。
  2. 将 Web 引用导入到我们的代码中(即 `Default.aspx.cs`)。例如:
    using JSimpCalcWebServiceService;
  3. 接下来,创建 Web 引用的对象。
    JSimpCalcWebServiceService.JSimpCalcWebServiceService proxy = 
                  new JSimpCalcWebServiceService.JSimpCalcWebServiceService();
  4. 现在,我们可以像调用其他方法一样访问 `WebMethod`。例如:
    proxy.addition(10,20);
    Create Web Service Client C# Code
    图十六:Web 方法调用代码

代码应如下所示:

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using JSimpCalcWebServiceService;

public partial class _Default : System.Web.UI.Page 
{
    JSimpCalcWebServiceService.JSimpCalcWebServiceService proxy;

    protected void Page_Load(object sender, EventArgs e)
    {
        proxy = new JSimpCalcWebServiceService.JSimpCalcWebServiceService();
    }

    protected void btnAddition_Click(object sender, EventArgs e)
    {
        try
        {
            lblResultAddition.Text = "Result: " + 
                   proxy.addition(double.Parse(txtbtnAdditionParameter1.Text), 
								double.Parse(txtbtnAdditionParameter2.Text));
        }
        catch (FormatException)
        {
            lblResultAddition.Text = "Result: Invalide Input";
        }
        UpdatePanelAddition.Update();
    }

    protected void btnSubtraction_Click(object sender, EventArgs e)
    {
        try
        {
            lblResultSubtraction.Text = "Result: " + 
                 proxy.subtraction(double.Parse(txtSubtractionParameter1.Text), 
									double.Parse(txtSubtractionParameter2.Text));
        }
        catch(FormatException)
        {
            lblResultSubtraction.Text = "Result: Invalide Input";
        }

        UpdatePanelSubtraction.Update();
    }
    protected void btnMultiplication_Click(object sender, EventArgs e)
    {
        try
        {
            lblResultMultiplication.Text = "Result: " + 
               proxy.multiplication(double.Parse(txtMultiplicationParameter1.Text), 
									double.Parse(txtMultiplicationParameter2.Text));
        }
        catch (FormatException)
        {
            lblResultMultiplication.Text = "Result: Invalide Input";
        }

        UpdatePanelMultiplication.Update();
    }

    protected void btnDivision_Click(object sender, EventArgs e)
    {
        try
        {
            lblResultDivision.Text = "Result: " + 
                proxy.division(double.Parse(txtDivisionParameter1.Text), 
								double.Parse(txtDivisionParameter2.Text));
        }
        catch (FormatException)
        {
            lblResultDivision.Text = "Result: Invalide Input";
        }

        UpdatePanelDivision.Update();
    }

    protected void btnMaximum_Click(object sender, EventArgs e)
    {
        try
        {
            lblResultMaxMin.Text = "Result: " + 
                   proxy.maximum(double.Parse(txtMaxMinParameter1.Text), 
							double.Parse(txtMaxMinParameter2.Text));
        }
        catch (FormatException)
        {
            lblResultMaxMin.Text = "Result: Invalide Input";
        }

        UpdatePanelMaxMin.Update();
    }

    protected void btnMinimum_Click(object sender, EventArgs e)
    {
        try
        {
            lblResultMaxMin.Text = "Result: " + 
                    proxy.minimum(double.Parse(txtMaxMinParameter1.Text),
								double.Parse(txtMaxMinParameter2.Text));
        }
        catch (FormatException)
        {
            lblResultMaxMin.Text = "Result: Invalide Input";
        }

        UpdatePanelMaxMin.Update();
    }

    protected void btnPower_Click(object sender, EventArgs e)
    {
        try
        {
            lblResultPower.Text = "Result: " + 
                       proxy.power(double.Parse(txtPowerParameter1.Text), 
							double.Parse(txtPowerParameter2.Text));
        }
        catch (FormatException)
        {
            lblResultPower.Text = "Result: Invalide Input";
        }

        UpdatePanelPower.Update();
    } 
}
源代码三:Default.aspx.cs 源代码

第四步:测试 Web 服务客户端应用程序

现在,通过单击“开始调试”工具栏按钮或按 **F5** 键来测试我们的 Web 服务客户端应用程序。Web 页面应如下所示:

Create Web Service Client Web Application Output

图十七:Web 站点输出

结论

本文试图演示 Web 服务使用的标准,而不太关注底层实现机制。这里展示的示例利用了 Web 服务的一些特性,如下所示:

  • **独立性**:Web 服务无需额外软件。
    1. 客户端:需要支持 XML/HTML 的编程语言。
    2. 服务器端:需要 Web 服务器和 SOAP 服务器。
  • **松耦合**:客户端和服务器仅了解消息 - 一种简单的协调级别,允许更灵活的重新配置。
  • **Web 启用**:Web 服务通过使用成熟的轻量级 Internet 标准在 Web 上发布、定位和调用。
  • **语言无关且可互操作**:客户端和服务器可以在不同的环境和不同的语言中实现。
  • **可组合**:Web 服务可以使用工作流技术进行聚合,以执行更高级别的业务功能。
  • **动态绑定**:通过 UDDI 和 WSDL,可以自动化 Web 服务的发现和绑定。
  • **程序化访问**:Web 服务方法不提供图形用户界面,而是在命令级别运行。
  • **封装现有应用程序**:可以通过实现 Web 服务作为接口来轻松集成独立的应用程序。

同样,我们也可以用 C# 创建 Web 服务,并由 Java Web 服务客户端应用程序调用。

© . All rights reserved.