Web服务以前看过,没有真的做过
《ASP.NET入门经典VB.NET编程篇》P574第18章讲的是web服务,最基本的东西都讲到了,P575有一个应用例子,我用的是C#,所以是看懂例子后自己写的,书是2002年3月出版的,用的是1.1,asp.net2.0里,有好多都不对头了
今天真的测试过了,分了两个服务器,一个做web服务器,一个放aspx页面
先说web服务,理论不写,我写的没有书的好,因为我理解的不多
在vs.net里,新建web服务是在新建网站里,不是新建项目,新建web服务后,会自动生成一个Service.asmx文件,为了命名空间的统一,要求设置Namespace,一般用自己的域名,我用的是:
我的测试文件如下:
using System;
using System.Data;
using System.Data.OleDb;
using System.Configuration;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
[WebService(Namespace = "http://www.nnllok.cn/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
private static readonly string dbConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + System.Web.HttpContext.Current.Server.MapPath(ConfigurationManager.ConnectionStrings["nnllConnectionString"].ConnectionString);
public Service () {
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
/// <summary>
/// 显示Hello World
/// </summary>
/// <returns></returns>
[WebMethod]
public string HelloWorld() {
return "Hello World";
}
/// <summary>
/// 显示“Hello, ***. Have a great day!”
/// </summary>
/// <param name="name">要显示的名字</param>
/// <returns></returns>
[WebMethod]
public string Hello(string name)
{
return "Hello, " + name + ". Have a great day!";
}
/// <summary>
/// 测试登录
/// </summary>
/// <param name="una">用户名</param>
/// <param name="upa">密码</param>
/// <param name="errMsg">传出参数,登录失败,传出失败原因,登录成功,传出用户编号</param>
/// <returns></returns>
[WebMethod]
public bool CheckLogin(string una, string upa, out string errMsg)
{
errMsg = "";
if (String.IsNullOrEmpty(una) || String.IsNullOrEmpty(upa))
{
errMsg = "请输入用户名或密码";
return false;
}
bool ok = true;
using (OleDbConnection connect = new OleDbConnection(dbConnectionString))
{
try
{
connect.Open();
}
catch (OleDbException ex)
{
errMsg = ex.Message;
return false;
}
using (OleDbCommand command = new OleDbCommand())
{
command.Connection = connect;
command.CommandText = "select UserID, UserPwd from A_User where UserLogin = @UserLogin";
command.Parameters.Add(new OleDbParameter("@UserLogin", una));
using (DataSet ds = new DataSet())
{
ds.Locale = System.Globalization.CultureInfo.InvariantCulture;
try
{
using (OleDbDataAdapter da = new OleDbDataAdapter())
{
da.SelectCommand = command;
da.Fill(ds);
}
}
catch (OleDbException exds)
{
ok = false;
errMsg = exds.Message;
}
if (ok)
{
using (DataTable dt = ds.Tables[0])
{
if (dt.Rows.Count == 0)
{
errMsg = "用户名或密码错误";
ok = false;
}
else
{
if (upa.Equals(dt.Rows[0]["UserPwd"].ToString()))
{
errMsg = dt.Rows[0]["UserID"].ToString();
}
else
{
errMsg = "密码错误";
ok = false;
}
}
}
}
}
}
connect.Close();
}
return ok;
}
}
这个服务,我传到测试空间里了,可以直接从浏览器里执行Service.asmx文件的
点击每一个方法名称,都可以进入调用调试这个方法的
输入Name参数后输出
也可以直接使用地址栏传递参数:Service.asmx/Hello?name=Cat,执行结果如下
以前我每一次看web服务,都是到这里就停的,知道怎么搞一个服务,知道一个服务可以用来做什么,因为一直没有真的想过要用,所以知道一点就停了,现在我真的想要用了,我继续测试下去,我做了一个Web应用,是一组aspx文件,我用这组文件调用Web服务里的方法
对Web应用,要调用Web服务里的方法,要做先添加Web引用,在URL中输入web服务的地址
点击“前往”,输入Web引用名后添加
这里的Web引用名和web服务里设置的命名空间不同的,这个相当于一个别名,是在网站里调用方法时使用的,我现在测试时,我使用的引用名是:NnllokService
添加引用后,会生成App_WebReferences文件夹,内有NnllokService(引用名)文件夹,有三个xml文件,这三个xml文件
disco:发现Web Service的协议
wsdl:Web Service的描述文件,这里记录着Web服务中每一个方法和参数
这三个文件我还没全部弄明白,记录这个地址:http://xhinker.com/CommentView,guid,eb947b5e-774f-485e-86d3-f8cdf8b073d9.aspx
添加引用后,还要在web.config里加入设置:
<appSettings>
<add key="NnllokService.Service" value="
http://web服务所在域名/Service.asmx"/>
</appSettings>
要做的设置就这么多啦,剩下的可以写页面调用web服务里的方法了
我的第一个页面是TestService.aspx,测试的是Hello和HelloWorld两个方法
aspx页面
Name:
<asp:TextBox ID="TbName" runat="server"></asp:TextBox>
<asp:Button ID="BtName" runat="server" Text="what's your name?" OnClick="BtName_Click" />
<asp:Button ID="BtWorld" runat="server" Text="Hello World" OnClick="BtWorld_Click" />
<br />
<asp:Literal ID="LtMsg" runat="server"></asp:Literal>
aspx.cs文件
using System;
using NnllokService;
public partial class TestService : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void BtName_Click(object sender, EventArgs e)
{
using (Service nnllTestService = new NnllokService.Service())
{
LtMsg.Text = nnllTestService.Hello(TbName.Text);
}
}
protected void BtWorld_Click(object sender, EventArgs e)
{
using (Service nnllTestService = new NnllokService.Service())
{
LtMsg.Text = nnllTestService.HelloWorld();
}
}
}
把文件传到另一个服务器上,运行好好呢
我的第二个页面是Login.aspx,用于测试CheckLogin方法的,这个方法读取数据库,判断输入的用户名和密码是不是正确的
aspx页面
Name:
<asp:TextBox ID="TbName" runat="server"></asp:TextBox>
<br />
Password:
<asp:TextBox ID="TbPwd" runat="server"></asp:TextBox>
<br />
<asp:Button ID="Button1" runat="server" Text="Login" OnClick="Button1_Click" />
<br />
<asp:Literal ID="LtMsg" runat="server"></asp:Literal>
aspx.cs文件
using System;
using NnllokService;
public partial class Login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
using (Service nnllTestService = new NnllokService.Service())
{
string msg;
if (nnllTestService.CheckLogin(TbName.Text, TbPwd.Text, out msg))
{
Session["UserID"] = msg;
Session["UserName"] = TbName.Text;
Response.Redirect("LoginOk.aspx");
}
else
{
LtMsg.Text = msg;
}
}
}
}
测试结果也是全部正常的
我觉得这个web服务好好玩,我现在开始明白前一段时间在看的三层了,这个web服务,真的是把逻辑业务全部分离了,界面是界面,和逻辑业务没有关系了