首页蓝耳朵|小小蓝耳朵广州图书馆外文室英语儿童读物资源介绍网佛教青年之友旧版收集永硕E盘Phonics Short Vowels Game 
vs.net2005下简单测试web服务
所属栏目:ASP.NET(webform)  时间:2009-11-20 20:06  作者:狼子

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,一般用自己的域名,我用的是:

[WebService(Namespace = "http://www.nnllok.cn/")]

我的测试文件如下:

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服务,真的是把逻辑业务全部分离了,界面是界面,和逻辑业务没有关系了

小楼宝宝的涂鸦花花(Imitater)的博客起名称骨测字皖ICP备06000023号-17