关于在VS2010 ASP.NET MVC3中使用WebService的实例
一直在听说WebService,但是没实际使用过,今天系统的学习了下WebService,做了下面这个实例,下面的实例部分有不正确的地方望大家指正。一起学习。
第一部分:知识点部分
我从网上找出下列关于webservice的一些知识点,认为比较重要的就总结如下。方便下次查阅。
1:WebService是一种跨编程语言和跨操作系统平台的远程调用技术,所谓远程调用就是一台计算机上的一个程序可以调用另外一台计算机上的一个对象的方法。
2:WebService采用Http协议传输数据(通过HTTP协议发送请求和接收结果),采用XML格式封装数据(xml中说明调用远程服务对象的一些方法,参数记返回的结果)。
由HTTP协议+XML数据格式=SOAP协议,即 WebService使用的是SOAP(简单对象访问协议),它是基于XML的。套用网上的一句话说,HTTP协议是普通公路,SOAP协议是高速公路。服务器和客户端的关系如下图所示:
3:WSDL(WebService Description Language)文件:WebService服务器端要通过一个WSDL文件来说明自己家里有什么服务可以对外调用,服务是什么(即方法,参数,返回值),服务的网络地址,用哪个url地址表示,服务通过什么方式来调用。WSDL文件时基于xml格式,该文件保存在WEB服务器上,通过URL地址可以访问。
暴露WSDL文件地址的方式两种: 注册到UDDI服务器
直接告诉客户端调用者
关于System.Web.Services空间下的类及方法的使用参考http://msdn.microsoft.com/zh-cn/library/9xe4bs0s.aspx
第二部分:实例部分
了解上面的一些知识点后,我开始编写测试程序。环境: vs2010 asp.net mvc3
先建立服务器端:
新建一个工程,取名叫MVCWebService,由于MVC自动生成的Model,View,Controller都是符合路由规则的,所以我把新建了一个文件夹WebService用来放服务器文件,
右击WebService-->Add-->New Item...
目录结构如下图:
Services.asmx的代码如下:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Web.Services;
6 using System.Web.Services.Protocols;
7
8 namespace MVCWebService.Models {
9 ///<summary>
10 /// Summary description for Services
11 ///Namespace:获取或设置用于 XML Web services 的默认 XML 命名空间。
12 ///我理解为WebService服务器端是由客户端来访问的,所以服务器的访问地址就是该命名空间
13 ///</summary>
14 [WebService(Namespace = "http://127.0.0.1:9090")]
15 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
16 [System.ComponentModel.ToolboxItem(false)]
17 // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
18 // [System.Web.Script.Services.ScriptService]
19 public class Services: WebService {
20
21 [WebMethod] //此属性表示该服务器方法客户端可以访问
22 public string HelloWorld() {
23 return "Hello World";
24 }
25
26 [WebMethod]
27 //通过SoapDocumentMethod可以重写Action属性的命名空间
28 [SoapDocumentMethod(Action = "http://127.0.0.1:9090/getString")]
29 public string GetString(string ReturnName) {
30 return "Hello :" + ReturnName;
31 }
32 [WebMethod]
33 public string GetMachinName() {
34 return Server.MachineName;
35 }
36 [WebMethod]
37 public string GetServerTime() {
38 return Context.Timestamp.TimeOfDay.ToString();
39 }
40 }
41 }
测试该服务器是否通过,可以直接运行该Services,图为:
这样服务器端就定义好了
现在来看客户端
新建一个mvc工程,命名为MvcClient,右击-->Add Server Reference..
确定后,客户端就可以调用服务器端定义的方法。
在HomeController的Index方法中返回服务器端的machinename,及输出Hello,you name. 代码及解释如下
然后在前台输出,整个客户端和服务器端就完成了。
当我完成这个实例后,我在想这样调用就好像是在调用一个dll,因为我的客户端和服务器端在同一个solution里, 而且我的服务器端是运行在本地,为了证实它确实能够在一个局域网内运行,我把我的服务器端发布到了公司的服务器上进行了下测试,为了更好的调试,我在服务器的HomeController加了个Index页面(因为之前的服务器连一个默认的页面都没有),然后修改了服务器端WebService的Namespace属性,将127.0.0.1更改为服务器的192.168.16.101,发布好后我直接运行我的客户端,希望可以读到服务器上的机器名,后来发现报错页面:
后来才发现,服务器端的访问地址变了,客户端Service reference的关联地址也应该做相应的改变,这样就可以得到服务器的机器名了。
页面显示
这样一个简单的WebService程序就完成了。 在做这个小程序的时候,有人说直接用WCF完成,其实我在想WebService都没有用过,就先尝试做下,我有问过WCF和WebService之间有什么联系,有人说WCF封装了WebService,也有人说Webservice是WCF的老版本,如果你看到这里知道答案,不妨给我指点下他们之间究竟有什么关系。^_^
在做的过程中有很多盲点,得谢谢mvc群中的Coder的热心帮助,O(∩_∩)O哈哈~