• 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类的方法没有什么区别,但是将在后台与服务器进行大量的通信,但是这都被很好地隐藏起来。

  • 相关阅读:
    MySQL隐式类型转换导致索引失效
    解决MySQL报错[Err] 1093
    二:C#对象、集合、DataTable与Json内容互转示例;
    一:Newtonsoft.Json 支持序列化与反序列化的.net 对象类型;
    Newtonsoft.Json 概述
    为什么Elasticsearch查询变得这么慢了?
    Elasticsearch 5.x 字段折叠的使用
    Elasticsearch 删除数据
    Linux环境下安装 ElasticHD
    ElasticHD Windows环境下安装
  • 原文地址:https://www.cnblogs.com/xiaocai0923/p/2276285.html
Copyright © 2020-2023  润新知