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

您的第一个 C# Web 服务

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.61/5 (204投票s)

2000 年 12 月 13 日

CPOL
viewsIcon

2944103

downloadIcon

33965

编写您的第一个 WebService 的简介。

引言

创建你的第一个 Web 服务非常简单。事实上,通过使用 Visual Studio.NET 中的向导,你可以在几分钟内让你的第一个服务启动并运行,而且无需编写任何代码。

在这个例子中,我在本地机器的 /WebServices 目录下创建了一个名为 MyService 的服务。文件将创建在 /WebServices/MyService 目录下。

将定义一个名为 MyService 的新命名空间,在这个命名空间内将有一组类来定义你的 Web 服务。默认情况下,将创建以下类:

Global (在 global.asax 中) 继承自 HttpApplication。这个文件是 ASP.NET 中标准 ASP global.asa 文件的等效文件。
WebService1 (在 WebService1.cs 中) 继承自 System.Web.Services.WebService。这是你的 WebService 类,它允许你公开可以作为 WebService 被调用的方法。

此外,还会创建许多文件:

AssemblyInfo.cs 包含程序集的版本和配置信息。
web.config 定义应用程序的运行方式(调试选项、cookie 的使用等)。
MyService.disco 服务的发现信息。
WebService1.asmx 你的 WebService URL。在浏览器中导航到此文件,你将看到一个用户友好的页面,显示可用的方法、所需的参数和返回值。甚至还提供了表单,允许你通过网页测试服务。
bin\MyService.dll 实际的 WebService 组件。在生成服务时创建。

默认创建的用于服务的类(在此例中)名为 WebService1,它位于 MyService 命名空间内。代码部分显示如下:

namespace MyService
{
    ...
    /// <summary>
    ///    Summary description for WebService1.
    /// </summary>
    [WebService(Namespace="http://codeproject.com/webservices/",
	            Description="This is a demonstration WebService.")]
    public class WebService1 : System.Web.Services.WebService
    {
        public WebService1()
        {
            //CODEGEN: This call is required by the ASP+ Web Services Designer
            InitializeComponent();
        }

        ...
        
        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
    }
}

会生成一个默认的 HelloWorld 方法,但被注释掉了。只需取消注释并生成项目。瞧!你就拥有了一个可以工作的 WebService。

WebService 应与命名空间相关联。你的向导生成的服务将具有命名空间 http://tempuri.org。如果你按原样编译并运行服务,你将收到一条冗长的消息,提示你应该选择一个新的命名空间,因此我们添加命名空间和 WebService 描述,如下所示:

[WebService(Namespace="http://codeproject.com/webservices/",
            Description="This is a demonstration WebService.")]
public class WebService1 : System.Web.Services.WebService
{
    ...

要测试服务,你可以右键单击 Visual Studio 中解决方案资源管理器里的 WebService1.asmx,然后选择“在浏览器中查看”。测试页面如下所示:

调用此方法将返回以下内容:

运行演示应用程序

如果你下载了本文的源代码,那么你需要在你的网站的根目录下创建一个名为 'WebServices' 的目录,并将下载的 zip 文件解压到其中。然后你应该会看到:

\WebServices
\WebServices\bin
\WebServices\WebService1.asmx
...

导航到 https:///WebServices/WebService1.asmx 可能不会显示 WebService,因为你需要确保 WebService 的程序集位于应用程序的 /bin 目录下。你还会发现你无法加载解决方案文件 MyService.sln。为了“一石二鸟”,你需要启动 IIS 管理控制台,打开你的网站条目,右键单击 WebServices 文件夹,然后单击 属性。单击“创建”按钮创建一个新应用程序,然后按 OK。/WebServices 目录现在是一个应用程序,因此 .NET 框架将从 /WebServices/bin 目录加载 WebService 程序集,并且你将能够加载和生成 MyService.sln 解决方案。

扩展示例

所以我们有了一个 WebService。不算太令人兴奋,但我们确实毫不费力地完成了。为了让事情稍微有趣一点,我们将定义一个返回自定义结构数组的方法。

MyService 命名空间内,我们将定义一个名为 ClientData 的结构:

    public struct ClientData
    {
        public String Name;
        public int    ID;
    }

然后定义一个新的方法 GetClientData。注意方法前面使用了 WebMethod 属性。这指定了该方法可作为 WebService 方法访问。

    [WebMethod]
    public ClientData[] GetClientData(int Number)
    {
        ClientData [] Clients = null;

        if (Number > 0 && Number <= 10)
        {
            Clients = new ClientData[Number];
            for (int i = 0; i < Number; i++)
            {
                Clients[i].Name = "Client " + i.ToString();
                Clients[i].ID = i;
            }
        }
        return Clients;
    }

如果我们编译,然后导航到 .asmx 页面,我们将看到一个表单,允许我们输入参数值。输入非整数值将导致类型错误,输入不在 1-10 范围内的值将返回一个空数组。但是,如果我们成功地获得了正确的输入参数,我们将看到以下 XML 文件:

就是这么简单。

缓存 WebServices

通常,WebService 在多次调用时会返回相同的结果,因此缓存信息以加快速度是有意义的。在 ASP.NET 中,只需将 CacheDuration 属性添加到你的 WebMethod 即可轻松完成:

[WebMethod(CacheDuration = 30)]
public ClientData[] GetClientData(int Number)
{

CacheDuration 属性指定了方法应缓存结果的时间长度(以秒为单位)。在此期间,所有来自 WebMethod 的响应都将相同。

你也可以使用类中的常量成员变量来指定 CacheDuration

private const int CacheTime = 30;	// seconds

[WebMethod(CacheDuration = CacheTime)]
public ClientData[] GetClientData(int Number)
{

为你的 WebMethods 添加描述

在浏览 .asmx 文件时创建的默认 WebMethods 列表中,最好附带每个方法的描述。Description 属性实现了这一点。

[WebMethod(CacheDuration = 30,
 Description="Returns an array of Clients.")]
public ClientData[] GetClientData(int Number)
{

你的默认 .asmx 页面将如下所示:

还有其他 WebMethod 属性可以控制缓冲、会话状态和事务支持。

部署 WebService

现在我们有了一个 WebService,让别人能够使用它(你可能会觉得我疯了,但……)将 WebService 发布到你的服务器需要正确部署你的解决方案。在 Visual Studio 的“生成”菜单中有一个“部署”选项,首次选择该选项时,它会启动一个向导,允许你向解决方案添加部署项目。这将创建一个安装包,你可以在服务器上运行该包,它将创建必要的目录、设置正确的参数并复制必要的文件。

这并不能真正让你了解到底发生了什么,所以我们将手动部署我们的 MyService

部署应用程序是使用 运行演示应用程序 中的步骤完成的。我们需要为我们的服务创建一个目录(或使用现有目录)来存放 .asmx 文件,并且我们需要将服务的程序集放在应用程序的 bin/ 目录中。你可以将 .asmx 文件放在网站的子目录中,并将程序集放在网站根目录的 /bin 文件夹中,或者将 /bin 放在包含 .asmx 文件的子目录中,并将该目录标记为应用程序(参见 上方)。

如果你选择创建一个单独的目录并将其标记为应用程序,那么在此目录中你需要添加以下文件和目录:

MyService.asmx此文件充当你的服务的 URL。
MyService.disco服务的发现文档。
web.config服务配置文件,用于覆盖默认的 Web 设置(可选)。
/bin此目录包含你的服务的程序集。
/bin/MyService.dll实际的服务程序集。

结论

编写 WebServices 非常简单。使用 Visual Studio.NET 的向导,编写和部署这些服务就像点击一下一样简单,但即使你想手动完成,涉及的步骤也极其简单。

© . All rights reserved.