客户端应用程序

本文的完整源代码:BuildingClientForWebServices_code.zip

一、概述

  简单对象访问协议(SOAP,Simple Object Access Protocol,参见http://www.w3.org/TR/SOAP/)的发展向Internet的边界发出了挑战。SOAP和HTTP使得我们能够登录到外部系统,执行远程方法调用。想象一下,你可以在墨尔本运行浏览器,跨越Internet调用西雅图公司主机上的服务。在这种体系上,相互协作的Web服务器能够在不牺牲安全性的情况下发布它们的业务逻辑。

  Microsoft的.NET体系赋予Web服务很重要的地位。在我看来,Web服务接口可能是.NET框架中最吸引人的工具。现在已经有数量相当可观的Web服务。Web服务的构造方法已经在不少文章中论及,例如http://www.15seconds.com/Issue/010430.htm。另外一个我们经常可以看到的问题是:如何在客户端使用这些Web服务?如何利用Web服务来满足我们对信息的需求?

  接下来我将回答这些问题。在这个过程中,我们要涉及的主题包括:

  • 客户程序如何与Web服务通信。
  • 如何创建调用现有Web服务的代理对象。
  • 如何创建客户程序。
    • Web浏览器客户
    • Windows应用客户
    • WAP客户

  学习这些内容最好的方法莫过于开发一个实际的应用。我们将使用www.xmethods.com提供的现成Web服务。这个Web服务将提取并返回NASDAQ的价格信息。客户程序有一个简单的界面,界面效果有所折衷,因为我们主要关注的是界面的构造方法和过程。

1.1 客户程序说明

  所有三种客户程序都允许用户输入一个公司代号。如果请求成功,则显示公司名字和股票价格;如果NASDAQ没有指定的公司代号,则显示一个错误信息。客户程序提供“Get Quote”和“Reset”这两个按钮,供用户交互操作使用。

二、必需的准备知识

  • .NET Web服务的基础知识
  • 关于.NET平台的基础知识
  • C#基础知识
  • 面向对象编程的基础知识。
  • 关于Visual Studio.NET的基础知识(Beta版本在MSDN网站)。
  • 关于.NET Mobile WEB SDK的基础知识(Beta版本在MSDN网站)。

2.1 开发环境说明

  我用Visual Studio.NET作为集成开发环境(IDE)。VS.NET的Beta版本没有把.NET Mobile Web加入到它的开发环境,因此我们必须用文本编辑器来构造WAP客户。下一个Visual Studio.NET版本将包含.NET Mobile Web SDK。

三、客户程序如何与Web服务通信?

  我们来简单回顾一下Web服务的功能。通常,Web服务的调用过程可以描述如下:如图1所示,位于Location A的用户以Internet为媒介,对位于Location B的Web服务器进行远程方法调用(RFC)。通信过程利用简单对象访问协议(SOAP))和HTTP协议完成。

 


图1:SOAP调用是远程函数调用,它执行Location B上Web服务组件的方法。输出结果以XML形式格式化后,返回给Location A的用户。

  我们是不是真的直接调用了Location B的Web服务器上的方法呢?刚开始接触这种新技术时,这是我最大的疑问。正如你可以想到的,它可能带来严重的安全威胁。作为Web管理员,我们不希望任何人利用Web资源去恶意地攻击敏感数据,也不希望无谓地浪费大量的带宽。另外,我们还要记住这是一个分布式应用程序,必须注意数据的组织方式。

  为了避免出现这些方面的问题,我们必须把对象行为复制到用户Web服务器本地。对于本例,我们将把Location B位置的Web服务功能复制到Location A位置。也就是说,我们创建了一个代表原始Web服务的代理对象。代理与原始Web服务一样拥有所有公用的数据接口。我们怎样才能获得公用的数据接口呢?在设计Web服务的时候,我们编写了一些只用于Web的方法。所有这些方法将被复制到代理对象。这避免了把Web服务(Location B)上的敏感业务逻辑直接暴露给恶意的黑客,从而起到一种保护作用。在某种意义上,我们实际上是在实现Location A和Location B之间的“对象数据交换的同步”。这个过程被称为在Location A上创建“代理对象”。

  因此,在Location A,我们实际操作的是代理对象,由代理对象建立与Location B端Web服务的关联以及把结果数据返回给Location A的用户。那么,我们究竟如何来完成这个过程呢?

  把图1重新整理一遍,这会让我们的思路更清晰一些:

 


图2:Web浏览器客户与Web服务在Internet上的通信过程。

  代理对象是Web服务调用的一个基本概念。创建Web服务客户程序的第一个步骤就是创建代理对象。有了代理对象,我们就可以在各种平台上(Web浏览器,WAP,PDA,SOAP客户程序)通过代理对象提取数据。

四、创建Web服务代理对象

  .NET框架为创建代理对象提供了一个WebServiceUtil.exe工具(请参见MSDN说明)。它是一个命令行提示的工具。WebServiceUtil最简单的语法是:

WebServiceUtil /c:proxy /pa:http://yourDomain/someFolder/yourWebService.asmx?SDL 
参数 说明
/c:proxy 指示编译器创建一个代理对象。
/pa:<WebServerURL> 找出SDL文件的路径。SDL即Service Description Language,或服务描述语言。把“?SDL”加到Web服务后面将获得SDL契约。

  上面是最低参数要求。下面是其他几个重要的功能。

参数 说明
/disco:<FileName> 该选项创建一个“发现”(Discovery)文件。发现文件是为那些不知道Web服务具体URL的用户提供的Web服务查找方法之一。发现文件是一个XML格式的文件,它给出了一个可用Web服务的摘要。创建发现文件是一种良好的习惯。Visual Studio.NET Web服务器工程会自动以新工程一部分的形式创建默认发现文件。你可以启用“Dynamic Discovery”实现“.disco”文件的自动跟踪。关于该文件的详细介绍,请参见MSDN介绍。
/l:<Language Code> 语言可以是C#、Visual Basic或JScript。例如,/l:Csharp。
/n:<Namespace> 你想要包含该类的名称空间。该名称空间中的所有类都可以访问该代理对象。
/o:<Location> 你想要在哪个位置创建文件。如果忽略,它将是当前目录。
/i:<Namespace> 想要导入该类的其他名称空间。
/protocol:<protocol Name> 即将生成的代理对象所使用的协议:SOAP,HTTP GET,HTTP POST。默认是SOAP。

下面是一个创建代理对象的例子:

 


图3

  这个命令在当前目录下创建了一个“LiveQuote.cs”文件。这是一个C#文件,属于WebServiceClients名称空间。创建客户程序时,你将会认识到创建这个WebServiceClients名称空间的重要性。现在我们要编译这个C#类。编译命令生成一个可以连接到客户程序的.DLL文件,我们将把该文件放到bin目录下。

 

 
图4

  执行编译命令之后,bin目录下面会出现一个LiveQuotes.dll文件。如果你想要查看有关编译C#类的信息,请参考.NET SDK帮助文档。

  就这么简单。只用两个命令,我们就创建好了一个代理对象,接下来就可以从Web服务提取数据。不管业务逻辑有多么复杂,代理对象包含了完整的公用接口。记住,我们甚至还没有注册DLL。我们只是编译了源代码并把DLL文件放到bin目录之下,但这已经足以让Web服务器访问代理对象的DLL了。如果你不熟悉ASP.NET的应用部署机制,这可能使你感到困惑。事实上,我们无需为了让操作系统认可DLL而去注册DLL,只需把它放入本地“bin”目录就可以让.NET框架在运行的时候访问它。

  下面我们来看看创建客户端程序的过程。创建任何一个客户端程序都包含以下共同的步骤:

  • 创建一个代理对象的实例。
  • 调用代理对象上的方法。
  • 获取从Web服务返回的XML格式的数据。
  • 编写客户端代码显示结果。

五、构造Web页面客户端

  1)Web服务监听器处理HTTP GET、HTTP POST、和SOAP方法调用。首先,让我们在Visual Studio.NET中创建一个Web工程。

 

 
图5

  在New Project对话框中,选择工程类型Visual C# Projects,选择工程模板Web Appliation,为新的工程取名字“LiveQuotes_Clients”,设置服务器位置(比如http://localhost),最后点击OK按钮。这时,VS.NET将创建一个新的工程,并在默认Web服务器上创建一个LiveQuotes_Clients虚拟目录。同时,在DriveName/wwwroot下,VS.NET将创建一个名字同样为LiveQuotes_Clients的物理目录。

  2)右击工程的“Reference”,再选择“Add Reference”。

 

 
图6

  点击“Projects”选项卡,导航到代理对象的DLL。

 

 
图7

  3)利用工具箱里面的“Web form controls”创建ASP.NET文件。如果你曾经做过VB开发,那么对你来说,这应该就象公园里散步一样简单。

 

 
图8

  我通过修改默认的WebForm1.aspx,创建了Client_WebForm_POST.aspx文件。当我向窗体插入Web控件时,VS.NET自动在后台生成了C#代码。C#代码的文件名字将是Client_WebForm_POST.cs。

  下面是Visual Studio.NET Beta版本中的一个小故障:当我们加入一个对DLL的引用时,我们希望VS.NET自动插入相关的代码,但事实上它却没有。我们必须手工输入下面的代码才能访问WebServiceClients名称空间。

 

using WebServiceClients; 

  代理livequotes.DLL属于WebServiceClients名称空间。因此,现在我们已经可以在代码中访问这个DLL。另外,我们还要编写一些代码处理用户界面、用户交互活动,例如点击按钮等。

 

public void btn_GetQuote_Click (object sender, System.EventArgs e)
{ LiveQuotes ProxyLiveQuotes = new LiveQuotes();
    try
        { label_PriceValue.Text = ProxyLiveQuotes.MSNGetLastQuote(txt_CompanyCode.Text).ToString();
          label_NameValue.Text = ProxyLiveQuotes.MSNGetCompanyName(txt_CompanyCode.Text).ToString();
        }
    catch
        { label_PriceValue.Text = "0.0"; label_NameValue.Text = "The Company data is not available";
        }

}

public void btn_Reset_Click (object sender, System.EventArgs e)
{ label_PriceValue.Text = "0.0"; label_NameValue.Text = " ";
} 

  完整的代码可以从本文末尾下载。考虑到可能出现非法的公司代号,我们用一个try和catch块来处理异常。

  4)点击Debug -> Start编译代码,打开浏览器窗口。

 

 
图9

  你可以在浏览器中输入一个公司代号,浏览器将显示出价格信息。

 

 
图10

  Visual Studio.NET用POST方法作为默认数据发送方法。但是,我们可以方便地改用GET方法,只需把HTML表单的“method=POST”属性改成“method=GET”就可以了。

六、客户端Windows应用

  在Visual Studio.NET中,为Web服务创建Windows客户应用是很方便的。下面我们来看看具体的步骤。

  1)从New Project文件对话框中,选择“Windows Application”。

 

 
图11

  2)右击“References”,然后点击“Add Reference”。

 

 
图12

  3)点击“.NET Reference”,加入“System.Web.Services.dll”。引入控制台和所有Windows Web服务客户是一种良好的习惯。

  4)点击“Projects”选项卡,导航到“LiveQuotes.dll”,把这个DLL作为引用加入。

 

 
图13

  5)为Windows应用创建窗体。你可以从左边的工具框拖放窗体元素(标签,按钮,等等)。Visual Studio.NET将在后台生成C#代码。我们只需要输入触发用户事件句柄的代码(完整的代码可以从本文后面下载)。

  下面是按钮被点击时执行代码的关键部分。

protected void btn_GetQuote_Click (object sender, System.EventArgs e)
{ LiveQuotes windowsClient = new LiveQuotes();
    try
    { label_PriceValue.Text = windowsClient.MSNGetLastQuote(txt_CompanyCode.Text).ToString();
      label_Name.Text = windowsClient.MSNGetCompanyName(txt_CompanyCode.Text).ToString();
    }
    catch
    { label_PriceValue.Text = "0.0"; label_Name.Text = "The Company data is not available";
    }
}

protected void btn_Reset_Click (object sender, System.EventArgs e)
{ txt_CompanyCode.Text = ""; label_Name.Text = ""; label_PriceValue.Text = "";
} 

  6)运行客户程序(从Visual Studio.NET选择Debug -> Start)。

 

 
图14

  7)输入一个公司代号,然后点击“Get Quote”按钮。你将从NASDAQ获得股票信息。

 

 
图15

  代码创建了一个代理对象,利用SOAP和HTTP调用远程对象的函数。try和catch异常处理块用来避免应用程序遇到非法股票代码的时候出现故障。

七、WAP界面

  传统的WAP应用往往用纯Wireless Markup Language(WML)编写。.NET Mobile SDK使得我们能够利用类似于ASP.NET页面的控件创建WAP接口,它比编写WML脚本要快得多。

  每一个.NET Mobile页面的顶端应该有以下指令:

<%@ Page Inherits="System.Mobile.UI.MobilePage" Language="C#" %>
<%@ Register TagPrefix="Mobile" Namespace="System.Mobile.UI" %> 

  另外,我们还要能够访问livequotes.dll:

<%@ Import Namespace = "WebServiceClients" @%> 

  下面是完整的代码:

<%@ Page Inherits="System.Mobile.UI.MobilePage" Language="C#" %>
<%@ Register TagPrefix="Mobile" Namespace="System.Mobile.UI" %>
<%@ Import Namespace="WebServiceClients" %>

<script runat="server" language="c#">

protected void GetQuoteCommand_OnClick(Object sender, EventArgs e)
{ LiveQuotes ProxyLiveQuotes = new LiveQuotes();
    try
        { Code.Text = "Company Code - " + CompanyCode.Text;
          CompanyName.Text = "Name - "  + ProxyLiveQuotes.MSNGetCompanyName(CompanyCode.Text);
          Price.Text = "Price - " + ProxyLiveQuotes.MSNGetLastQuote(CompanyCode.Text);
        }
    catch
        { Code.Text = "Company Code - " + CompanyCode.Text;
          CompanyName.Text = "Name - The company data is not available";
          Price.Text = "Price - " + "0.0";
        } ActiveForm = SecondForm;
}

</script>

<Mobile:Form runat="server">
    <Mobile:Label runat="server">Enter the Company Code:</Mobile:Label>
    <Mobile:TextBox runat="server" id="CompanyCode" />
    <Mobile:Command runat="server" OnClick="GetQuoteCommand_OnClick" 
        Text="Get Quote" />
</Mobile:Form>

<Mobile:Form runat="server" id="SecondForm">
    <Mobile:Label runat="server" id="Code" />
    <Mobile:Label runat="server" id="CompanyName" />
    <Mobile:Label runat="server" id="Price"  />
</Mobile:Form> 

  Microsoft .NET Mobile Web SDK具有把IE浏览器作为WAP客户使用的能力,它有助于提高开发速度。我用IE 5.5模拟下面的WAP功能。

 


图16

  点击“Get Quote”之后,我们将得到下面的结果:

 


图17

八、结束语

  本文讨论的焦点是Microsoft的Web服务。Microsoft不是这个市场中的唯一玩家,IBM和Sun都在为了抢占Web服务市场的份额而努力拼搏。下面是几个为IBM和Java爱好者提供的好起点:

  探索Web服务确实是一件令人感兴趣的事情。Web服务这个概念听起来很迷人,所有主要的厂商都加入到了支持Web服务的大军。然而,唯有时间才能告诉我们从这种技术我们能够得到多少。

九、代码下载和安装说明

  完整的代码请从本文最后下载,下面是设置客户端软件的说明:

    • 解开WinZip文件。
    • 把源代码复制到IIS的虚拟目录。
    • 创建一个代理对象。
    • 按照本文的说明,创建和执行客户程序。
原文地址:https://www.cnblogs.com/newcoder/p/4125429.html