主要内容包括:
一、实验要求
二、运行环境
三、实验原理
四、实验步骤
四、实验心得
五、详细代码(简易计算器)
一、实验要求
编写一个网页,使其具有简单的数值计算功能。
二、运行环境
Windows10,Microsoft Visual Studio 2017
三、实验原理
Web Service调用原理:
实现一个完整的Web服务工作流程:
- Web服务提供者设计实现Web服务,并将调试正确后的Web服务通过Web服务中介者发布,并在UDDI注册中心注册;
- Web服务请求者向Web服务中介者请求特定的服务,中介者根据请求查询UDDI注册中心,为请求者寻找满足请求的服务;
- Web服务中介者向Web服务请求者返回满足条件的Web服务描述信息,该描述信息用WSDL写成,各种支持Web服务的机器都能阅读;
- 利用从Web服务中介者返回的描述信息生成相应的SOAP消息,发送给Web服务提供者,以实现Web服务的调用;
- Web服务提供者按SOAP消息执行相应的Web服务,并将服务结果返回给Web服务请求者。
四、实验步骤
本程序以Microsoft .Net为开发平台,通过Microsoft Visual Studio 2017来创建Web Service服务。
1、启动Microsoft Visual Studio 2017,新建项目;
2、在新打开的窗口左边的选择框中,在已安装的模板下,选择Visual C# -> Web -> 先前版本,选择新建ASP.NET空网站,点击确定,继续;
3、新建项目的界面右侧,有个“解决方案资源管理器”对话框,点击新建的项目名称,右键点击并选择添加 -> Web服务(ASMX),(可以选择对其重新命名),并继续;
4、在WebService.cs中添加自定义测试功能代码(即自己想要实现的功能的代码);
5、运行asmx文件(即上一步中的WebService.cs文件):
运行成功,我们需要记住浏览器中的URL即上图中红色方框标记的地址,在后续步骤中将会用上;6、和第三步类似,在项目的解决方案管理器中,点击项目名称,并添加一个Web窗体,并给其命名为“Add”,继续;
7、在新建的Add.aspx文件中,从工具箱(默认在项目界面左侧)中拖出三个控件:textbox1,textbox2,label分别用来显示整数a,整数b, 以及计算的和。另外再添加一个点击按钮工具“Button”,并为其添加一个点击事件“ OnClick=“BtnAdd_Click” ”,其功能为调用Web服务:
8、现在,为网站项目添加Web服务,点击新建项目名称 -> 添加 -> 服务引用:
9、在弹出的“添加服务引用”窗口中,把第5步生成的服务地址填入“地址”栏,然后点击“转到”,在显示的服务中,选择“WebServiceSoap”,点击确定,继续;
成功添加服务引用后,会在项目的目录结构中显示出来;
10、在项目的目录结构中,点击第6步生成的“Add.aspx”文件,打开其源代码:
在打开的Add.aspx.cs文件中,添加按钮控件“Button”对应的逻辑代码,实例化一个服务对象,需要注意的是,“Button”逻辑代码中的函数名(这里为BtnAdd_Click)必须与第7步中的Add.aspx文件中的Button工具的点击事件“OnClick=“BtnAdd_Click” ”描述相一致,才能在Web服务调用时完成函数的调用:
11、现在运行Add.aspx文件,在输入框中分别输入两个整数,然后点击按钮“加”,其结果就会在标签“Label”中显示出来:
12、到此,本Web Service程序的基本实现步骤就已经完成,其他的具体功能、代码和页面显示效果将在后面的详细代码中给出。支持的计算功能包括:加、减、乘、除、阶乘和开根号,下面是本程序的最终实现结果展示示例:
四、实验心得
在写这个程序的时候,所接触的WebService相关知识也就只有课堂上老师讲的,以及课本上所涉及的内容,刚开始的时候,感觉迷茫,不知道从哪里开始。后来在网上看了一些相关的资料,在慢慢的把这个程序整体框架完成。当然,具体的函数功能代码不是问题,但页面的显示效果又让我感到苦恼,后来在舍友的帮助下,以及自己在网上学习了一些相关的学习资料,才最终完成了这个简单的计算器。
尽管这个项目很简单,因为所使用的Visual Studio平台已经提供了相关的框架,我们只需要把需要实现的功能代码添加进去,就会得到我们想要的结果。但它却涵盖了Web服务生成、发表和调用的全过程,所以通过这次实验,加深了我对Web服务相关知识的理解,也对今后的学习打下了基础。最重要的是,要学会自己去接触并吸收新知识的能力。
五、详细代码(简易计算器)
1、WebService.cs代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
/// <summary>
/// WebService 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
// [System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService
{
[WebMethod]
public double ForSUM(double a, double b)
{
return a + b;
}
[WebMethod]
public double ForSub(double a, double b)
{
return a - b;
}
[WebMethod]
public double ForMul(double a, double b)
{
return a * b;
}
[WebMethod]
public double ForDiv(double a, double b)
{
return a / b;
}
[WebMethod]
public double ForFac(double a)
{
double t =1;
for(double i =1;i<=a;i++)
{
t *= i;
}
return t;
}
[WebMethod]
public double ForSqrt(double a)
{
return System.Math.Sqrt(a);
}
}
2、Calculate.aspx代码,这部分代码包含了该程序在浏览器中的界面点击按钮描述和显示效果:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Calculate.aspx.cs" Inherits="Calculate" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>简单数字运算</title>
<style>
body {
font-family:楷体;
font-size:22px;
}
.bo {
margin-top:100px;
margin-left:100px;
width:600px;
height:auto;
border:2px solid #858c66;
background-color:rgba(149, 156, 99, 1);
}
p{
text-align:center;
font-size:40px;
color:black;
margin-bottom: 20px;
margin-top: 20px;
}
table{
padding-left:110px;
margin-bottom:10px;
}
.result{
padding-left:50px;
font-size:40px;
}
.button{
font-size:20px;
font-family:楷体;
}
.answer_view{
background-color:lightgray;
width:100%;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div class="bo">
<div>
<p>简易计算器</p>
<div>
<asp:Label ID="res" runat="server" Text="答案:" Class="result"></asp:Label>
</div>
<div class="answer_view">
<table>
<tr>
<td><asp:Label ID="labResult" runat="server" Text="" > </asp:Label> </td>
</tr>
</table>
</div>
<table>
<tr>
<td> <asp:Label ID="labA" runat="server" Text="A">a:</asp:Label> </td>
<td> <asp:TextBox ID="txtA" runat="server"></asp:TextBox> </td>
</tr>
<tr>
<td> <asp:Label ID="labB" runat="server" Text="B">b:</asp:Label> </td>
<td> <asp:TextBox ID="txtB" runat="server"></asp:TextBox> </td>
</tr>
</table>
<table>
<tr>
<td> <asp:Button ID="Button1" runat="server" Text="加" OnClick="btnSum_Click" class="button"/> </td>
<td> <asp:Button ID="Button2" runat="server" Text="减" OnClick="btnSub_Click" class="button" /> </td>
<td> <asp:Button ID="Button4" runat="server" Text="乘" OnClick="btnMul_Click" class="button"/> </td>
<td> <asp:Button ID="Button5" runat="server" Text="除" OnClick="btnDiv_Click" class="button"/> </td>
<td> <asp:Button ID="Button3" runat="server" Text="阶乘" OnClick="btnFac_Click" class="button" /> </td>
<td><asp:Button ID="Button6" runat="server" Text="开根号" OnClick="btnSqrt_Click" class="button" /></td>
</tr>
</table>
<span>提示:只能对a求阶乘(a为整数)和开根号。如果数的位数过长,会超出这个框,但结果是正确的~( ̄▽ ̄)~*</span>
</div>
</div>
</form>
</body>
</html>
3、Calculate.aspx.cs代码,该部分代码包含了该程序在浏览器界面中的点击按钮的逻辑实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Calculate : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnSum_Click(object sender, EventArgs e)
{
WebService fs = new WebService();
double a = txtA.Text.ToString().Trim() == "" ? 0 : Convert.ToDouble(txtA.Text.ToString().Trim());
double b = txtB.Text.ToString().Trim() == "" ? 0 : Convert.ToDouble(txtB.Text.ToString().Trim());
labResult.Text = a+"+"+b+"="+fs.ForSUM(a, b).ToString();
}
protected void btnSub_Click(object sender, EventArgs e)
{
WebService fs = new WebService();
double a = txtA.Text.ToString().Trim() == "" ? 0 : Convert.ToDouble(txtA.Text.ToString().Trim());
double b = txtB.Text.ToString().Trim() == "" ? 0 : Convert.ToDouble(txtB.Text.ToString().Trim());
labResult.Text = a + "-" + b + "=" + fs.ForSub(a, b).ToString();
}
protected void btnMul_Click(object sender, EventArgs e)
{
WebService fs = new WebService();
double a = txtA.Text.ToString().Trim() == "" ? 0 : Convert.ToDouble(txtA.Text.ToString().Trim());
double b = txtB.Text.ToString().Trim() == "" ? 0 : Convert.ToDouble(txtB.Text.ToString().Trim());
labResult.Text = a + "*" + b + "=" + fs.ForMul(a, b).ToString();
}
protected void btnDiv_Click(object sender, EventArgs e)
{
WebService fs = new WebService();
double a = txtA.Text.ToString().Trim() == "" ? 0 : Convert.ToDouble(txtA.Text.ToString().Trim());
double b = txtB.Text.ToString().Trim() == "" ? 0 : Convert.ToDouble(txtB.Text.ToString().Trim());
labResult.Text = a + "/" + b + "=" + fs.ForDiv(a, b).ToString();
}
protected void btnFac_Click(object sender, EventArgs e)
{
WebService fs = new WebService();
double a = txtA.Text.ToString().Trim() == "" ? 0 : Convert.ToDouble(txtA.Text.ToString().Trim());
double b = System.Math.Floor(a);
labResult.Text =b+"!"+"="+fs.ForFac(b).ToString();
}
protected void btnSqrt_Click(object sender, EventArgs e)
{
WebService fs = new WebService();
double a = txtA.Text.ToString().Trim() == "" ? 0 : Convert.ToDouble(txtA.Text.ToString().Trim());
labResult.Text = "√" + a+"=" + fs.ForSqrt(a).ToString();
}
}