基础知识
发展进程:1.在Visual Studio 2005里提供的Add Web Reference(添加Web服务引用),用于添加Web Services引用
2.在Visual Studio 2008保留Add Web Reference(添加Web服务引用),是为了版本向前兼容。基于.NET Framework 2.0。
3.Visual Studio 2008在升级以后为了对.NET Framework 3.0 或 3.5版本上WCF Service Library的支持。增加了Add Service Reference(添加服务引用)功能。Framework3.0 或 3.5 时可用。
Add Web Reference(添加Web服务引用)和Add Service Reference(添加服务引用)联系和区别
联系:主要添加引用都有一个获取服务元数据,反序列话本地类文件的过程。这个结构也基本类似。都包含wsdl\discovery等文件。
区别:Add Web Reference 生成的 Reference.cs文件里,包含一个服务代理类,他负责与Web服务通信,它继承一个Soap类,使用SOAP协议,SOAP简单对象访问协议,基于XML语言。此外还包含一些Web服务类里定义的方法,和与之相关的异步调用方法和事件。遵守.NET Web Service 的主要规则。
Add Service Reference生成的客户端文件 Reference.cs。我看了一下,这个也会反序列化一个本地代理类,很相似和前者。不过除了服务类和其相关的一些别的类和契约接口。其中比较重要就是一个契约和一个通信管道。这个主要和WCF框架
的编程模型和反序列话机制有关系。因为WCF 强调的是 契约的概念,还有就是绑定协议,这个就直接决定了客户端和服务端通信的通道类型。你在这个文件里也能看到。此外还有服务请求和相应对应的信息。遵循WCF服务框架的规则。
下面是写的例子。可以查看Add Web Reference(添加Web服务引用)和Add Service Reference(添加服务引用)实现的区别:
1.创建一个Web Servcies程序
[WebService(Namespace = "http://127.0.0.1:8771/")] //为发布Webservices发布虚拟目录所在的域名
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
// [System.Web.Script.Services.ScriptService]
public class Webserver01 : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
/// <summary>
/// 根据学生名称得到该学生的成绩
/// </summary>
/// <param name="name"></param>
/// <param name="intsecond"></param>
/// <returns></returns>
[WebMethod]
public int GetGrades(string name, int intsecond)
{
if (intsecond > 0)
{
Thread.Sleep(intsecond * 1000);
}
int intGrade = 0;
switch (name)
{
case "小白":
intGrade = 90;
break;
case "小黑":
intGrade = 70;
break;
case "小红":
intGrade = 60;
break;
default:
intGrade = 0;
break;
}
return intGrade;
}
}
2 创建一个调用的控制台程序 Add Web Reference(添加Web服务引用),同步调用
class Program
{
static void Main(string[] args)
{
WebServer.Webserver01 webServer = new WebServer.Webserver01();
Console.WriteLine("请输入要查询成绩的学生的姓名:");
string strName = Console.ReadLine();
Console.WriteLine("请输入要延迟的秒数:");
int intSecond = int.Parse(Console.ReadLine());
Console.WriteLine("同步调用开始");
Console.WriteLine("同步调用结果为:" + webServer.GetGrades(strName, intSecond));
Console.WriteLine("同步调用结束");
Console.ReadLine();
}
}
创建一个调用的控制台程序 Add Service Reference(添加服务引用),同步调用
class Program
{
static void Main(string[] args)
{
ServiceReference1.Webserver01SoapClient web = new ServiceReference1.Webserver01SoapClient();
Console.WriteLine("请输入要查询成绩的学生的姓名:");
string strName = Console.ReadLine();
Console.WriteLine("请输入要延迟的秒数:");
int intSecond = int.Parse(Console.ReadLine());
Console.WriteLine("同步调用开始");
Console.WriteLine("同步调用结果为:" + web.GetGrades(strName, intSecond));
Console.WriteLine("同步调用结束");
Console.ReadLine();
}
}
同步调用的结果:
异步调用:Add Web Reference(添加Web服务引用),同步调用
/// <summary>
/// 基于任务的异步操作
/// 异步调用客户端
/// </summary>
class Program
{
static void Main(string[] args)
{
localhost.Webserver01 web = new localhost.Webserver01();
Console.WriteLine("请输入要查询成绩的学生姓名:");
string strName = Console.ReadLine();
Console.WriteLine("请输入要延迟的秒数:");
int intsecond = int.Parse(Console.ReadLine());
Console.WriteLine("异步调用开始");
web.GetGradesCompleted += new localhost.GetGradesCompletedEventHandler(service_Completed);
web.GetGradesAsync(strName, intsecond);//开始异步调用
Console.WriteLine("当前进程没有被阻塞");
for (int i = 0; i < 3; i++)
{
Console.WriteLine(i);
}
Console.ReadLine();
}
private static void service_Completed(object sender, localhost.GetGradesCompletedEventArgs e)
{
Console.WriteLine("异步调用的结果为:" + e.Result);
Console.WriteLine("异步调用结束");
}
}
异步调用的结果: