星空网 > 软件开发 > ASP.net

搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)

【系统环境】Windows 7 / 2008r2

【软件环境】Visual Studio 2010

【开发语言】C#

【感谢】本文是在 《C#开发和调用Web Service》 一文的基础上做了少许修改及补充后整理所得。

1. WebService

1.1 基本概念

Web Service也叫


Soap:(Simple Object Access Protocol)简单对象存取协议。是
WSDL:(Web Services Description Language) WSDL 文件是一个
UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。在用户能够调用Web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的

Web Service的工作原理:http://www.cnblogs.com/Jessy/p/3528341.html

1.2 特点

Web Service的主要目标是跨平台的可互操作性。为了实现这一目标,Web Service 完全基于

1.跨防火墙的通信

如果应用程序有成千上万的用户,而且分布在世界各地,那么客户端和服务器之间的通信将是一个棘手的问题。因为客户端和服务器之间通常会有防火墙或者代理服务器。传统的做法是,选择用浏览器作为客户端,写下一大堆ASP页面,把应用程序的中间层暴露给最终用户。这样做的结果是开发难度大,程序很难维护。要是客户端代码不再如此依赖于HTML表单,客户端的编程就简单多了。如果中间层组件换成Web Service的话,就可以从用户界面直接调用中间层组件,从而省掉建立ASP页面的那一步。要调用Web Service,可以直接使用Microsoft SOAP Toolkit或.net这样的SOAP客户端,也可以使用自己开发的SOAP客户端,然后把它和应用程序连接起来。不仅缩短了开发周期,还减少了代码复杂度,并能够增强应用程序的可维护性。同时,应用程序也不再需要在每次调用中间层组件时,都跳转到相应的“结果页”。

2.应用程序集成

企业级的应用程序开发者都知道,企业里经常都要把用不同语言写成的、在不同平台上运行的各种程序集成起来,而这种集成将花费很大的开发力量。应用程序经常需要从运行的一台主机上的程序中获取数据;或者把数据发送到主机或其它平台应用程序中去。即使在同一个平台上,不同软件厂商生产的各种软件也常常需要集成起来。通过Web Service,应用程序可以用标准的方法把功能和数据“暴露”出来,供其它应用程序使用。

3.B2B的集成

B2B 指的是Business to Business,as in businesses doing business with other businesses,商家(泛指企业)对商家的电子商务,即企业与企业之间通过互联网进行产品、服务及信息的交换。通俗的说法是指进行电子商务交易的供需双方都是商家(或企业、公司),她们使用了Internet的技术或各种商务网络平台,完成商务交易的过程。

Web Service是B2B集成成功的关键。通过Web Service,公司可以只需把关键的商务应用“暴露”给指定的供应商和客户,就可以了,Web Service运行在Internet上,在世界任何地方都可轻易实现,其运行成本就相对较低。Web Service只是B2B集成的一个关键部分,还需要许多其它的部分才能实现集成。用Web Service来实现B2B集成的最大好处在于可以轻易实现互操作性。只要把商务逻辑“暴露”出来,成为Web Service,就可以让任何指定的合作伙伴调用这些商务逻辑,而不管他们的系统在什么平台上运行,使用什么开发语言。这样就大大减少了花在B2B集成上的时间和成本。

4.软件和数据重用

Web Service在允许重用代码的同时,可以重用代码背后的数据。使用Web Service,再也不必像以前那样,要先从第三方购买、安装软件组件,再从应用程序中调用这些组件;只需要直接调用远端的Web Service就可以了。另一种软件重用的情况是,把好几个应用程序的功能集成起来,通过Web Service “暴露”出来,就可以非常容易地把所有这些功能都集成到你的门户站点中,为用户提供一个统一的、友好的界面。可以在应用程序中使用第三方的Web Service 提供的功能,也可以把自己的应用程序功能通过Web Service 提供给别人。两种情况下,都可以重用代码和代码背后的数据。


从以上论述可以看出,Web Service 在通过Web进行互操作或远程调用的时候是最有用的。不过,也有一些情况,Web Service根本不能带来任何好处,Web Service有一下缺点:

1.单机应用程序

目前,企业和个人还使用着很多桌面应用程序。其中一些只需要与本机上的其它程序通信。在这种情况下,最好就不要用Web Service,只要用本地的API就可以了。COM非常适合于在这种情况下工作,因为它既小又快。运行在同一台服务器上的服务器软件也是这样。当然Web Service 也能用在这些场合,但那样不仅消耗太大,而且不会带来任何好处。

2.局域网的一些应用程序

在许多应用中,所有的程序都是在Windows平台下使用COM,都运行在同一个局域网上。在这些程序里,使用DCOM会比SOAP/HTTP有效得多。与此相类似,如果一个.NET程序要连接到局域网上的另一个.NET程序,应该使用.NET Remoting。其实在.NET Remoting中,也可以指定使用SOAP/HTTP来进行Web Service 调用。不过最好还是直接通过TCP进行RPC调用,那样会有效得多。


1.3 WebService的应用

1.最初的

2.以

例如,用户可以开发一个采购应用程序,以自动获取来自不同供应商的价格信息,从而使用户可以选择供应商,提交订单,然后跟踪货物的运输,直至收到货物。而供应商的应用程序除了在Web上提供服务外,还可以使用

2. Web Service开发

.NET平台内建了对Web Service的支持,包括Web Service的构建和使用。与其它开发平台不同,使用.NET平台,你不需要其他的工具或者SDK就可以完成Web Service的开发了。.NET Framework本身就全面支持WebService,包括服务器端的请求处理器和对客户端发送和接受SOAP消息的支持。下来我们就一步一步的用Microsoft Visual Studio .NET 2010(后面简称VS.NET 2010)创建和使用一个简单的Web Service。

2.1 创建一个最简单的WebService

首先,打开VS2010,打开“文件-新建-网站”,选择“ASP.NET Web服务”。

1. 如果选用的 .NET Framework 4,选择 ASP.NET 空网站,如下图所示。

搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)

我们将项目文件夹命名为WebServiceTest,即上图中的WebSite1修改为WebServiceTest,新建生成的项目目录结构如下图所示。

搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)

查看Service.cs代码,你会发现VS.Net 2005已经为Web Service文件建立了缺省的框架。原始代码如下。

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Services; 6  7 [WebService(Namespace = "http://tempuri.org/")] 8 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 9 // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 10 // [System.Web.Script.Services.ScriptService]11 12 public class Service : System.Web.Services.WebService13 {14   public Service () {15 16     //如果使用设计的组件,请取消注释以下行 17     //InitializeComponent(); 18   }19 20   [WebMethod]21   public string HelloWorld() {22     return "Hello World";23   }24   25 }

默认的工程文件已有了 HelloWorld 方法,直接运行效果如下图。

搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)

点击上面的 “HelloWorld” 超链接,转至如下页面。

搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)

再点击“调用”按钮,就可以看到用

搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)

2.2 创建一个附带简单功能的WebService

上面我们宏观的了解了Web Service,其实它就是个对外的接口,里面有函数可供外部客户调用(注意:里面同样有客户不可调用的函数)。假若我们是服务端,我们写好了一个WebService,然后把它给了客户(同时我们给了他们调用规则),客户就可以在从服务端获取信息时处于一个相对透明的状态.即是客户不了解(也不需要)其过程,他们只获取数据.在代码文件里,如果我们写了一个函数后,希望此函数成为外部可调用的接口函数,我们必须在函数上面添上一行代码[WebMethod(Description="函数的描述信息")],如果你的函数没有这个申明,它将不能被用户引用.下来我们开始编写一个简单的Web Service 的例子。

先把默认的HelloWorld方法注释掉,简单的写了求加减乘除运算的四个方法。

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Services; 6  7 [WebService(Namespace = "http://tempuri.org/")] 8 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 9 // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 10 // [System.Web.Script.Services.ScriptService]11 12 public class Service : System.Web.Services.WebService13 {14   public Service () {15 16     //如果使用设计的组件,请取消注释以下行 17     //InitializeComponent(); 18   }19 20   //[WebMethod]21   //public string HelloWorld() {22   //  return "Hello World";23   //}24   [WebMethod(Description = "求和的方法")]25   public double addition(double i, double j)26   {27     return i + j;28   }29   [WebMethod(Description = "求差的方法")]30   public double subtract(double i, double j)31   {32     return i - j;33   }34   [WebMethod(Description = "求积的方法")]35   public double multiplication(double i, double j)36   {37     return i*j;38   }39   [WebMethod(Description = "求商的方法")]40   public double division(double i, double j)41   {42     if (j != 0)43     {44       return i / j;45     }46     else {47       return 0;48     }49   }50 }

 启动调试可以看到我们自己写的可以被调用的方法,如下图。

搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)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

在此将项目文件夹命名为WebSite1,即修改上图中 Web位置下目录最后的 “WebSite4”为“WebSite1”。(读者可根据自己的需求命名)

选好存储位置,语言后点击确定,进入默认页面。然后先添加Web引用(注意不是添加服务引用,方法是:在资源管理器中点击右键,选择【添加服务引用】,点击 【高级】,【添加WEB引用】,调出对话框),把WebService引到当前的工程里面。方法是:在资源管理器中点击右键,选择添加Web 引用,调出对话框,如下图所示。

搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)

我们在这就练习调用webservice的四个方法,做一个简单的调用的例子,先在网站的前台添加几个控件,修改 Default.aspx 中的代码,如下。

 1 <%@ Page Title="主页" Language="C#" AutoEventWireup="true" MasterPageFile="~/Site.master" CodeFile="Default.aspx.cs" Inherits="_Default" %> 2 <asp:Content ID="Content1" runat="server" ContentPlaceHolderID="HeadContent"> 3 </asp:Content> 4 <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> 5   <div> 6     <asp:TextBox ID="Num1" runat="server"></asp:TextBox> 7     <select id="selectOper" runat="server"> 8       <option>+</option> 9       <option>-</option>10       <option>*</option>11       <option>/</option>12     </select>13     <asp:TextBox ID="Num2" runat="server"></asp:TextBox>14     <span id = "E" runat="server"></span>15     <asp:TextBox ID="Result" runat="server"></asp:TextBox>16   </div>17 </asp:Content>

在这个例子里面,动态的创建了一个button控件来触发WebService的调用,然后再修改后台 Default.aspx.cs 中的代码,处理背后的运算逻辑,如下。调用WebService之前和使用其它的对象一样,要先实例化,实例化的方法是localhost.Service a =new localhost.Service(),然后就可以通过a来访问WebService里面提供的方法了。

 1 using System; 2 using System.Data; 3 using System.Configuration; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Web; 7 using System.Web.Security; 8 using System.Web.UI; 9 using System.Web.UI.WebControls;10 using System.Web.UI.WebControls.WebParts;11 using System.Web.UI.HtmlControls;12 13 public partial class _Default : System.Web.UI.Page14 {15   protected void Page_Load(object sender, EventArgs e)16   {17     //在页面加载的时候动态创建一个按钮,在它的事件里调用Websercie18     Button btn = new Button();19     btn.Width = 24;20     btn.Text = "=";21     btn.Click += new EventHandler(btn_Click);22     E.Controls.Add(btn);23   }24 25   /// <summary>26   /// 定义动态创建Button的Click事件,在这个事件中调用Webservice27   /// </summary>28   /// <param name="sender"></param>29   /// <param name="e"></param>30   void btn_Click(object sender, EventArgs e)31   {32     if (Num1.Text != "" && Num2.Text != "")33     { 34       //实例化引用的webservice对象35       localhost.Service webserviceInstance = new localhost.Service();36       int Oper = selectOper.SelectedIndex;37       switch (Oper) { 38         //通过实例化的webservice对象来调用Webservice暴露的方法39         case 0:40           Result.Text = webserviceInstance.addition(double.Parse(Num1.Text), double.Parse(Num2.Text)).ToString();41           break;42         case 1:43           Result.Text = webserviceInstance.subtract(double.Parse(Num1.Text), double.Parse(Num2.Text)).ToString();44           break;45         case 2:46           Result.Text = webserviceInstance.multiplication(double.Parse(Num1.Text), double.Parse(Num2.Text)).ToString();47           break;48         case 3:49           Result.Text = webserviceInstance.division(double.Parse(Num1.Text), double.Parse(Num2.Text)).ToString();50           break;51       }52     }53   }54 }

运行后可以看到效果,如下图所示,在前面两个Textbox里面输入两个操作数,在中间的下拉列表中选择操作符,然后点击“=”号,将计算的结果输出到第三个Textbox里面。

搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)

而此时整个计算并不是在本地进行的,是在Web服务端进行计算的然后将结果通过

搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)

到此一个一个简单的WebService的开发和调用就已经完成了,在实际应用中可以根据自己的需要,写一些功能强大、复杂的WebService。无论多复杂,整个流程都是如此。

2.3 在 IIS 上搭建 ASP.NET 并调用 WebService

上述操作是在 Visual Studio 2010 的调试环境下进行的。为了保证WebService能够提供可持续的服务,以及建立一个(本地)可持续访问的站点,需要将网站搭建在 IIS 上。关于 IIS 的配置以及如何搭建网站不是本文的研究内容,读者可以自行搜索相关教程。

此节主要讲述搭建过程中的注意事项、会遇到的问题以及解决方法。

在 IIS 网站的默认 localhost 站点下,添加虚拟目录

1. WebServiceTest:其物理路径即为2.1提到的WebServiceTest目录。(WebService)

2. WebSiteForServiceTest:其物理路径即为2.1提到的WebSite1目录。(ASP.NET站点)

注意,需要将所添加的两个虚拟目录均转换为应用程序。将虚拟目录装换为转换为应用程序后,虚拟目录将以程序的形式运行,有自己独立的应用程序池,保存自己独立的数据,而不是继承主网站的数据配置。如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致错误:"分析器错误消息: 在应用程序级别之外使用注册allowDefinition='MachineToApplication' 的节是错误的"。

搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)

    搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)

关于 .NET Framework

1. WebServiceTest 的应用程序池选择 DefaultAppPool,如下图所示,不然会报错。关于原因,由于笔者才接触 ASP.NET 不久,在web.config中还没看出道道来,需要摸索…… 若有高人知晓,还望指点迷津。

搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)

2. WebSiteForServiceTest 的应用程序选择 ASP.NET v4.0 (管道模式:集成),如下图所示,不然也会报错。关于原因,笔者只在 web.config 中找到如下代码。

<compilation debug="true" targetFramework="4.0"/>

搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)

修改配置

前面两部设置完成后,可以通过本地浏览器访问 WebService,如下图所示。

搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)

而在访问 ASP.NET 网站之前还需要修改 web.config 中的相关属性,如下图所示。之前调试状态下 localhost 之后有端口号,现在搭建在本地 IIS 之后,端口号依默认站点确定(本环境下默认 80 端口)。

搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)

上述配置成功后,即可在浏览器中访问站点,并调用 WebService,如下图所示。

搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)


3. 结语

至此完成了最简单的调用 WebService 的 ASP.NET 站点,并对 WebService 有了初步认识。

【参考文献】

[1] C#开发和调用Web Service

[2] IIS7中的站点、应用程序和虚拟目录详细介绍




原标题:搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)

关键词:ASP.NET

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流