webservice的创建、发布及调用示例(以调用自己发布的webservice和中国气象局提供的webservice为例)
webservice(web服务)的存在让我们可以利用网络发布和调用远程的API接口,实现编程的需要,例如,中国气象局向外提供了一个webservice,该服务中包含了获取各大城市的天气情况的API接口,这时如果我们想要在本机上编写代码获取城市的天气情况,就不用自己编写API了(这种API估计也不可能写出来,因为天气情况的数据库一般只有气象局才有),可以通过远程调用气象局对外提供的webservice API 就可以轻松获得天气情况了。
相信通过上面的描述,你已经大概知道了什么是webservice,其实webservice通俗一点讲就是某个人或机构写的类,类中含有实现特定意义的函数(方法),但是这个类是不同于一般类的,不同之处在于这个类要通过网络访问。
好,话不多说,进入正题。。。。。
一、webservice的创建
为简单起见,我们创建的webservice非常简单,只提供了一个返回长方体体积的一个函数,函数不在复杂,能说明原理就可以。下面为其创建过程:
1,打开vs2005,新建一ASP.NET Web 服务应用程序
2,在Service1.axmx.cs文件中写代码,这里要注意的就是对外提供的方法,一定要是public的,而且要加上WebMethod标签,切记,否则对外是看不到这个方法的。
using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;
namespace myWebService
{
/// <summary>
/// Service1 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class Service1 : System.Web.Services.WebService
{
//[WebMethod]
//public string HelloWorld()
//{
// return "Hello World";
//}
[WebMethod(Description = "这是一个用来计算长方体体积的webservice")]//注意这里一定要带上WebMethod标签,而且是public的才能对外提供方法,Description属性是对该方法的描述文字,可以不要。
public double getVolume(double length, double width, double height)
{
return getArea(length, width) * height;
}
[WebMethod(Description = "这是一个用来计算长方形面积的webservice")]//由于私有的方法是不会对外提供的,所以这里的WebMethod标签可以不写。
private double getArea(double len, double wid)
{
return len * wid;
}
}
}
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;
namespace myWebService
{
/// <summary>
/// Service1 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class Service1 : System.Web.Services.WebService
{
//[WebMethod]
//public string HelloWorld()
//{
// return "Hello World";
//}
[WebMethod(Description = "这是一个用来计算长方体体积的webservice")]//注意这里一定要带上WebMethod标签,而且是public的才能对外提供方法,Description属性是对该方法的描述文字,可以不要。
public double getVolume(double length, double width, double height)
{
return getArea(length, width) * height;
}
[WebMethod(Description = "这是一个用来计算长方形面积的webservice")]//由于私有的方法是不会对外提供的,所以这里的WebMethod标签可以不写。
private double getArea(double len, double wid)
{
return len * wid;
}
}
}
3,此时浏览这个webservice页面,可以看到该服务对外提供的方法,只有类型为public,并且加上了webmethod标签的方法才会在这个页面显示。
到这里,webservice的创建工作已经完成,接下来就是发布webservice了。
二、发布webservice
你可以把webser发布到http,ftp或者磁盘路径,具体的发布方法入下:
1,右击项目,选择“发布……”
2,选择好路径后就算是发布成功了,我这里是发布在本机,以本机作为服务器。
3,其实在我们创建完webservice并运行其之后,webservice已经完成了发布工作,发布的网址就是运行页面中看到的网址:http://localhost:1230/Service1.asmx。。。
三、调用webservice
这里分两种webservice的调用,其一是我们刚写好的webservice的调用,其二是调用中央气象局给我们提供的webservice,从而实现查询“长沙”的天气情况。
(一)调用自己刚写好的webservice
1,新建一windows应用程序,其实新建一ASP.NET应用程序的调用方法也是一样的,这里选择建立以桌面程序。
2,右击该项目,选择“添加web引用……”
3,添加webservice的地址,选择“前往”,可以看到webservice提供的方法名和描述,然后“添加该引用”
这一步完成了webservice的引用,可以看到项目中多了一个名为“localhost”的web reference,这有点类似于本地组件的调用,不同点在于它是基于网络的。
4,布局好form1,设置如下
5,在btnVolume的Click事件中添加代码如下
private void btnVolume_Click(object sender, EventArgs e)
{
double len = double.Parse(txtLength.Text.ToString());
double wid = double.Parse(txtWidth.Text.ToString());
double hei = double.Parse(txtHeight.Text.ToString());
localhost.Service1 ser = new Test.localhost.Service1();//实例化service1
double vol = ser.getVolume(len, wid, hei);//调用service1的方法
MessageBox.Show("长方体的体积为:"+vol.ToString());
}
{
double len = double.Parse(txtLength.Text.ToString());
double wid = double.Parse(txtWidth.Text.ToString());
double hei = double.Parse(txtHeight.Text.ToString());
localhost.Service1 ser = new Test.localhost.Service1();//实例化service1
double vol = ser.getVolume(len, wid, hei);//调用service1的方法
MessageBox.Show("长方体的体积为:"+vol.ToString());
}
6,编译完成,执行结果如下:
到这里一个webservice的调用就完成了,和本地的组件的调用相比,其调用速度上要慢些,这主要限制于服务器的网络传输速度。。。
(二)调用中央气象局提供的webservice实现天气的查询
中央气象局提供的webservice地址为:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx 知道这个网址后,我们就可以调用其对外提供的方法,实现自己查询城市天气的目的。
1,新建一windows应用程序,名为“WeatherReport”,设置form1的布局如下:
2,在此项目中添加web引用,地址为http://www.webxml.com.cn/WebServices/WeatherWebService.asmx
3,在btngetWeather的Click事件中添加如下代码:
private void btngetWeather_Click(object sender, EventArgs e)
{
WeatherReport.cn.com.webxml.www.WeatherWebService wws = new WeatherWebService();
string[] weather = wws.getWeatherbyCityName(txtCity.Text.ToString());
for (int i = 0; i < weather.Length; i++)
{
txtWeather.Text += System.Environment.NewLine;
txtWeather.Text += weather[i].ToString();
}
}
{
WeatherReport.cn.com.webxml.www.WeatherWebService wws = new WeatherWebService();
string[] weather = wws.getWeatherbyCityName(txtCity.Text.ToString());
for (int i = 0; i < weather.Length; i++)
{
txtWeather.Text += System.Environment.NewLine;
txtWeather.Text += weather[i].ToString();
}
}
4,调用过程完成,执行该程序查询长沙的天气情况
程序运行成功,说明调用webservice的方法成功了。