一句话理解:提供可供外部访问的方法,实现跨平台访问
注意:
在客户端是添加“服务引用”,而不是引用
当服务端更新了服务之后,在客户端,一定也要“更新服务”
当要执行异常调用时,要在前台.aspx的头部中加上Async="true"
一:服务端定义
|
右击---->添加---->新建项---->web服务---->
打开新建的WebService1.asmx可以看到
[WebMethod] ---要被外部访问,这个就不能省常用[WebMethod(Description="描述信息")]
public string HelloWorld() ---提供给外部访问的方法
{
Return "Hello World";
}
其中方法HelloWorld()就是提供给外部进行访问,但要实现外部访问,上面的[WebMethod]必须加上,否则就不能被外部访问。
|
二、客户端调用:添加引用:右击“引用”---->添加服务引用
|
同步调用:
|
using (ServiceReference1.WebService1SoapClient client = new ServiceReference1.WebService1SoapClient())
{
Response.Write(client.HelloWorld());
//List<User> dt = client.GetList();
}
说明:ServiceReference1为命名空间
|
异步调用法一:
|
A:在ServiceReference1(Service References下面)上右击---->配置服务引用---->使”异步操作”处于选中状态,并确定
B:在页面前台添加:Async="true"
如:<%@ Page Language="C#" AutoEventWireup="true" Async="true" CodeBehind="异步调用一.aspx.cs" Inherits="WebApplication2.异步调用一" %>
C:
在页面.aspx.cs中
protected void Page_Load(object sender, EventArgs e)
{
using (ServiceReference1.WebService1SoapClient client = new ServiceReference1.WebService1SoapClient())
{
//异步加载完数据库执行这个事件,因为是异步的,所以不知道是什么时候加载完数据
client.HelloWorldCompleted += new EventHandler<ServiceReference1.HelloWorldCompletedEventArgs>(client_HelloWorldCompleted);
//执行
client.HelloWorldAsync();
}
}
void client_HelloWorldCompleted(object sender, ServiceReference1.HelloWorldCompletedEventArgs e)
{
//加载完数据后就接收服务端返回的数据
string s = e.Result;
Response.Write(s);
}
|
异步调用法二:
BackgroundWorker
|
public partial class SOAP : System.Web.UI.Page
{
protected string loginInfo = string.Empty;
protected void Page_Load(object sender, EventArgs e)
{
BackgroundWorker bw = new BackgroundWorker();//开启单独线程执行操作
bw.DoWork += new DoWorkEventHandler(bw_DoWork);//指定要作什么
//当后台操作完之后
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
//开始后台操作
bw.RunWorkerAsync();
}
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
loginInfo = e.Result.ToString();//得到值,如果是可以是DataSet,List<userinfo>等类型
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
using (ServiceReference1.WebService1SoapClient client = new ServiceReference1.WebService1SoapClient())
{
ServiceReference1.UserInfo info = new ServiceReference1.UserInfo();
info.Name = "admin";
info.Pwd = "admin";
e.Result = client.GetInfo(info);
}
}
}
|
|
|
验证访问:输入用户名和密码才能访问
|
方式一:
直接在方法中操作
|
|
在服务端:
|
[WebMethod(Description = "验证使用")]
public string Check(string name,string pwd)
{
if (name == "admin" && pwd == "admin")
{
return "验证成功";
}
else
{
return "验证失败";
}
}
|
在客户端:
|
A:引用命名空间:using System.ComponentModel;
B:在.aspx.cs中
protected void Page_Load(object sender, EventArgs e)
{
using (ServiceReference1.WebService1SoapClient client = new ServiceReference1.WebService1SoapClient())
{
Response.Write(client.Check("admin", "adman"));
}
}
|
方式二:
通过SOAP简单对象访问协议
|
过程,在方法的前面加上,通过SOAP在调用方法前先调用 SOAP中的方法
|
服务端新建类UserInfo.cs
继承SoapHeader类
|
public class UserInfo:SoapHeader
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private string pwd;
public string Pwd
{
get { return pwd; }
set { pwd = value; }
}
private bool CheckUser(string name,string pwd)
{
if (name == "amdin" && pwd == "admin")
{
return true;
}
else
{
return false;
}
}
public bool CheckUser()
{
return CheckUser(name, pwd);
}
}
|
服务端.asmx.cs中
|
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
public UserInfo userinfo;//声明刚创建的类
//标准一下我们这个方法使用哪个SoapHeader进行校验,客户端网站调用该方法时需要指定自己定义的SoapHeader内容
//这样,虽然GetInfo()并没有参数,但在在使用时,要先定义userinfo的SoapHeader的头,放在GetInfo中
[SoapHeader("userinfo")]//声明刚创建的类的实例
[WebMethod(Description="登录")]
public string GetInfo()
{
if(userinfo.CheckUser())
{
return "登录成功";
}
else
{
return "登录失败";
}
}
}
|
在客户端更新服务引用
|
在客户端页面
.aspx.cs中
|
public partial class SOAP : System.Web.UI.Page
{
protected string loginInfo = string.Empty;
protected void Page_Load(object sender, EventArgs e)
{
using (ServiceReference1.WebService1SoapClient client = new ServiceReference1.WebService1SoapClient())
{
ServiceReference1.UserInfo header = new ServiceReference1.UserInfo();
header.Name = "admin";
header.Pwd = "admin";
loginInfo = client.GetInfo(header);
}
}
}
|