WebService学习之摄氏温度和华氏温度转换

创建一个简单的Web服务,实现摄氏温度和华氏温度之间的来回转换操作功能。

知识点:

1.熟悉WebService的代码结构;

2.使用Wsdl.exe工具生成代理类的源代码;

3.编译该代理类的源代码文件。

代码如下:

using System;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class TemperatureService : System.Web.Services.WebService
{
public TemperatureService()
{

//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}

[WebMethod]
public double ToCelsius(double TF) //华氏度转成摄氏度 C=(F-32)*(5/9)
{
return (5d / 9d) * (TF - 32);
}

[WebMethod]
public double ToFahrenheit(double TC) //摄氏度转成华氏度 F=C*(9/5)+32
{
return (9d / 5d) * (TC + 32);
}
}

 

运行如下:

 

上面看到的是用浏览器获取Web服务。在有些情况下,需要在应用程序中访问Web服务,解决的办法是创建一个远程Web服务的本地代理类,调用代理类的方法等同于调用Web服务的方法。

可以用.NET的SDK中命令行工具wsdl.exe生成代理类。如果安装Microsoft Visual Studio.NET,则可在“开始”->“所有程序”->“Microsoft Visual Studio 2008”->“Visual Studio Tools”->“Visual Studio 2008 命令提示”下执行工具wsdl。如果只安装了SDK,则在C:\Program Files\Microsoft.NET\SDK目录下可以找到这个工具。当然如果我们安装了VS2008的话就不用另外安装SDK,直接可以在Visual Studio 2008命令提示中使用wsdl工具。(我在C:\Program Files\Microsoft.NET\SDK目录没有找到wsdl.exe这个执行工具,但命令一样有效。)

建立一个代理类的步骤如下:

(1)使用Wsdl.exe工具生成代理类的源代码;

(2)编译该代理类的源代码文件;

(3)将编译后的代理类拷贝到/bin目录中。

生成TemperatureService Web服务的代理类,可以用如下的命令:

wsdl /l:cs http://localhost:3861/Temperature/TemperatureService.asmx?wsdl

/l 表示用于生成代理类的源代码文件的语言,这里用的是C#。接着是提供给Wsdl的Web服务的WSDL地址,执行生成TemperatureService.cs文件(在C:\Program Files\Microsoft Visual Studio 9.0\VC目录)。

再将该文件编译成DLL文件(上一篇文章说过有关编译的方法,这里不再重复了)。但有一个地方要注意的是,如下图:

上面提示编译不成功的原因是文件路径带有空格,我们可以把TemperatureService.cs拷贝到C盘,再执行如下图:

 

最后,我们来测试一下这个代理类,可以另外新建一个项目,将TemperatureService.dll拷贝到ASP.NET目录的/bin目录下,这样就可以使用这个代码类了。

代码如下:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>测试TemperatureService代理类</title>
</head>
<body>
<form id="form1" runat="server">
Fahrenheit(输入华氏温度):
<asp:TextBox ID="txtFahrenheit" runat="server"></asp:TextBox>
<asp:Button ID="Convert" Text="Convert" runat="server"
onclick
="Convert_Click" />
<hr />
<asp:Label ID="lblCelsius" runat="server"></asp:Label>
</form>
</body>
</html>

 

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;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}
protected void Convert_Click(object sender, EventArgs e)
{
TemperatureService objTemp = new TemperatureService();
this.lblCelsius.Text = objTemp.ToCelsius(Double.Parse(this.txtFahrenheit.Text)).ToString("n");
}
}


运行和结果如下图:

 

如果出现如下的错误:

根据提示可以知道,如想调用代理类,代理类的项目必须正在运行中,否则就会出现如上的错误。 

 

总结:

调用代理类的方法与调用其他.NET类的方法没有什么区别,但是将在后台与服务器进行大量的通信,但是这都被很好地隐藏起来。

posted @ 2011-12-05 00:19  冒牌工程师  阅读(1728)  评论(0编辑  收藏  举报