Web Service是应用程序组件,使用开放协议进行通信,它是独立的,并且可自我描述,可通过UDDI来发现,可被其他应用程序使用。
XML是Web Service的基础,基础的Web Service平台是XML+HTTP,前者提供了一种可用于不同的平台和编程语言之间的语言,后者是最常用的因特网协议。
Web Service平台的元素有:SOAP(简单对象访问协议)、UDDI(通用描述、发现及整合)、WSDL(Web Service描述语言)。Web Service平台是简单的可共同操作的消息收发框架,缺少许多诸如安全和路由等重要的特性,但只要SOAP变得高级,这些问题就会得到解决。
SOAP指简单对象访问协议,是一种通信协议,是一种用于发送信息的格式,被设计用来通过因特网进行通信,用于应用程序之间的通信,它基于XML,独立于平台和语言,它很简单,并且可扩展,允许绕过防火墙。
WSDL是基于XML的用于描述Web Service以及如何访问Web Service的语言,即WSDL指网络服务描述语言,使用XML编写,是一种XML文档,用于描述网络服务,也可用于定位网络服务。
UDDI是一种目录服务,通过它,企业可注册并搜索Web Service。UDDI指通用的描述、发现以及整合,是一种用于存储有关Web Service的信息的目录,是一种由WSDL描述的网络服务接口目录,它被构建与Microsoft.NET平台之中,经由SOAP进行通讯。
文件——新建——项目:Visual C#——Web——ASP.NET Web应用程序——空
右键项目名称——添加——新建项:web服务
看到的界面为:
点击工具栏里的浏览器进行调试,可以看到第一个helloword()的运行结果:
4、根据这个步骤建立两个WebService,分别为WebService1和WebService2。此处为两个WebService添加不同的方法以便更好地区分。
//WebService1
[WebMethod(Description = "求和方法")]
public int Sum(int a, int b)
{
int sum = a + b;
return sum;
}
//WebService2
[WebMethod(Description = "求积方法")]
public int Product(int a, int b)
{
int product = a * b;
return product;
}
WebService1:发布后链接:http://localhost:49954/WebService1.asmx
WebService2:发布后链接:http://localhost:64862/WebService2.asmx
1)添加Web引用
在WebService1中:右键引用——添加服务引用——高级——添加Web引用——url:输入WebService2发布后的链接——转到——添加引用。
在输入WebService2发布后的链接并点击转到按钮后,可看到出现了WebService2的网页界面;在添加引用按钮上面,有一个Web引用名,默认为localhost,在代码中会用到,一般最好修改为其它名字;点击添加引用后,可以看到解决方案管理器里引用下面多了Web References。
此时Web.config里增加了相关配置代码:
http://localhost:64862/WebService2.asmx
2)在WebService1中调用WebService2的Product()函数:
[WebMethod]
public int WebService(int a, int b)
{
localhost.WebService2 webService = new localhost.WebService2(); //localhost为上面添加引用时Web引用名的默认值,最好修改为其它
int count = webService.Product(a, b);
return count;
}
然后运行:默认以xml格式显示结果
1)在WebService1中:右键引用——添加服务引用——在地址中输入WebService2的链接——转到——确定。
点击转到后,服务中出现WebService2,点击它,出现WebService2Soap,再点击它,操作中出现WebSercvice的两个函数。一般默认命名空间为ServiceReference1,与上面的localhost是一个作用,最好修改它。点击确定后,引用里多了下图的两个引用。
此时Web.config里增加了相关配置代码:
2)在WebService1中调用WebService2的Product()函数:
[WebMethod]
public int WebService()
{
ServiceReference1.WebService2SoapClient webservice = new ServiceReference1.WebService2SoapClient(); //ServiceReference1为添加服务引用的命名空间
int count = webservice.Product(2, 3);
return count;
}
本地调试时一般为固定地址,当需要发布或迁移时,最好就要使用动态链接调用了。
此处使用上面的第二种方法进行动态调用。先在WebService2SoapClient上右键——转到定义,查看WebService2SoapClient提供的方法,可以看到它可以接受两个参数:服务引用的名称、服务引用的链接。
在Web.config中找到服务引用的名字:name="WebService2Soap",将WebService2的端口改为60713,修改上面的代码:
[WebMethod]
public int WebService()
{
ServiceReference1.WebService2SoapClient webservice = new ServiceReference1.WebService2SoapClient("WebService2Soap", "http://localhost:60713/WebService1.asmx");
int count = webservice.Product(2, 4);
return count;
}
当需要随时动态修改链接时,将参数2服务引用的链接写到程序的配置文件里,此处改为一个变量,然后用变量去读取配置文件里的连接。
1)在WebService1项目的bin目录下创建一个config.xml文件(打开文件夹,在文件夹中新建,工程目录会自动显示它),可做如下编写:
http://localhost:60713/WebService1.asmx
2)右键项目名称——添加——新建项:全局应用程序类Global.asax:
3)在Global.asax的Application_Start()中读取配置文件信息:
using System.Xml;
using System.IO;
protected void Application_Start(object sender, EventArgs e)
{
XmlDocument configXml = new XmlDocument();
string strPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin", "config.xml");// 上面新建的"config.xml";
if (File.Exists(strPath))
{
//加载xml文件并且读取文件根节点(每个xml文件有且仅有一个根节点)
configXml.Load(strPath);
XmlNode root = configXml.SelectSingleNode("config");
//读取config.xml文件里的webservice_path
XmlNodeList webservice_path= root.SelectNodes("webservice_path");
string abc = ((XmlElement)webservice_path.Item(0)).ChildNodes.Item(0).InnerText;
}
}
4)对于配置文件config.xml来说,文件的内容是随时可变的,属于动态变量。但是对于C#工程来说,它读取的永远都是config.xml的节点,节点名是不变的,它是静态变量。也即是只要程序运行,Global.asax里读取的值就不会改变,程序里引用的这个对应值不会改变。如果要改变程序里的值,只有停止程序,修改后重新运行才会成功。
为了使结构清晰,新建一个类Config.cs,在类中定义静态变量,作为程序在运行时的变量名。这样,读取配置文件的结构就是:config.xml(可随时修改的配置文件)——Global.asax(读取配置文件的值)——Config.cs定义值对应的变量名,以供程序使用。config.xml和Config.cs的名字可以修改,Global.asax最好不要修改。
因此根据上面的例子,就需要添加一个类Config.class替代上面的变量abc:右键项目名称——添加——类,将类名设为Config.cs,在其中设置读取config.xml的静态变量,一般把该变量名设置为与xml文件中相同:
namespace WebApplication1
{
public class Config
{
public static string webservice_path;
}
}
修改第3步中最后一句代码,用上面定义的静态变量webservice_path替换其中定义的字符串abc
//把string abc 改为已经定义好的变量Config.webservice_path
Config.webservice_path = ((XmlElement)webservice_path.Item(0)).ChildNodes.Item(0).InnerText;
在其他地方需要使用webservice_path时直接就使用Config.webservice_path即可。
需要注意的是,引用类时必须是在相同的命名空间下,如果是不同的命名空间,需要使用“using namespace”引用命名空间,或者使用“命名空间.类名.函数名/方法名/变量名”来引用其他命名空间的方法。
3、把VS界面显示在WebService1.asmx上,运行程序即可。
当需要修改链接时,直接修改xml里的内容即可。
当配置文件里原本是WebService2的链接时,修改链接,有两种情况:
1)依旧调用WebService2,配置文件里写WebService2的新链接;
2)调用其他WebService,配置文件里写其他WebService的链接,如WebService3,但由于在链接下面跟着的代码是WebService2中的函数,因此如果WebService3中没有该函数,代码会报错,而如果有该函数,则调用的是WebService3中的函数。