加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

webservice实例(二)

发布时间:2020-12-17 02:32:46 所属栏目:安全 来源:网络整理
导读:qq 群: 19877329 Mail: yufan27209@qq.com By: jfan?2007-07-23 上篇文章介绍了些 webservice 的基本特性和我们例子的结构 , 这篇文章我们将开始具体的代码编写工作 . ????? 这个专题主要讲述的是 webservice, 因此这里我们的代码以 Webservice 相关为主 ,
qq 群: 19877329
Mail: yufan27209@qq.com
By: jfan?2007-07-23
上篇文章介绍了些 webservice 的基本特性和我们例子的结构 , 这篇文章我们将开始具体的代码编写工作 .
????? 这个专题主要讲述的是 webservice, 因此这里我们的代码以 Webservice 相关为主 , 而其他工程 , 例如 :usewebservice 只作简略介绍 .
????? VS2005 , 开发一个 webservice 并不是件困难的事 , 首先 , 我们新建一个 webservice 项目 ( 文件 -> 新建 -> 网站 ->ASP.NET WEB 服务 )
????? 建完这个工程 , 我们将看到一个叫 Service.asmx 的文件 , 这就是 webservice 的标准文件 , 它也有 UI 的概念 , 不过我们一般不关注 , 因此 , 我们查看其 cs 代码文件 . 如果你什么都还没做的话 , 将看见一个被注释掉的 helloworld WebMethod, 把注释去掉 , 在运行 , 你就可以得到最简单的 webservice 运行实例了 . 点击 "helloworld" 将执行其方法 . 显然 , 这个函数对我们的意义只在于宏观的了解了下 web 服务的写法 .
????? 下面 , 我们将开始具体介绍 webservice 的写法 . 在代码文件里 , 如果我们写了一个函数后 , 希望此函数成为外部可调用的接口函数 , 我们必须在函数上面添上一行代码 [WebMethod(Description=" 函数的描述信息 ")], 如果你的函数没有这个申明 , 它将不能被用户引用 . :
[WebMethod(Description=" 最简单的方法 ")]
? public string HelloWorld()
? {
?? return "Hello World";
? }
????? 这个函数就是外部可调用的接口函数 , 对用户来说相当于一个 API . 如果某用户在引用了这个服务后 , 他调用 HelloWorld() 方法 , 他就将获得 "HelloWorld" 这个返回值 .
API (Application Programming Interface)
所谓 API 本来是为 C C++ 程序员写的。 API 说来说去,就是一种函数,他们包含在一个附加名为 DLL 的动态连接库文件中。用标准的定义来讲, API 就是 Windows 32 位应用程序编程接口,是一系列很复杂的函数,消息和结构,它使编程人员可以用不同类型的编程语言编制出的运行在 Windows95 Windows NT 操作系统上的应用程序。
?????? 看到这里 , 我们是不是发现 , 其实 webservice 并不是那么的神秘 , 它也不过只是个接口 , 对我们而言 , 侧重点依然是接口函数的编写 . 下面 , 我将给出我们的例子所需要的接口函数 .
public class Service : System.Web.Services.WebService
{
AdoNetCon anc = new AdoNetCon(ConfigurationSettings.AppSettings["ZWOAConnectionString"]);
// 这是我写的一个类,用来操作数据库
??? public Service () {
??????? // 如果使用设计的组件,请取消注释以下行
??????? //InitializeComponent();
??? }
?
??? [WebMethod(Description="hello method")]
??? public string HelloWorld() {
??????? return "Hello World";
??? }
?
??? [WebMethod(Description = " 获取需要的信息" )]
??? public XmlDataDocument GetSiteAData()
??? {
??????? DataSet ds = new DataSet();
??????? try
??????? {
??????????? ds = anc.RunProc("select car_id,car_chePai,car_trademark from [zw_db].[dbo].tb_car",ds);
??????????? XmlDataDocument xd = new XmlDataDocument(ds);
??????????? return xd;
??????? }
??????? catch
??????? {
??????????? //System.Web.HttpContext.Current.Response.Write("Error!");
??????????? return null;
??????? }
??? }
?
??? [WebMethod(Description = " 查询获取需要的信息" )]
??? public XmlDataDocument getCar(string car_id,string car_chePai)
??? {
??????? DataSet ds = new DataSet();
??????? try
??????? {
??????????? string sql;
??????????? sql = "select car_id,car_trademark from [zw_db].[dbo].tb_car where 1=1";
??????????? if ((car_id == null) || (car_id.Length == 0))
??????????????? ;
??????????? else
??????????????? sql = sql +" and car_id =" + "'" + car_id + "'";
??????????? if ((car_chePai == null) || (car_chePai.Length == 0))
??????????????? ;
??????????? else
??????????????? sql = sql + " and car_chePai like " + "'%" + car_chePai + "%'";
??????????? ds = anc.RunProc(sql,ds);
??????????? XmlDataDocument xd = new XmlDataDocument(ds);
??????????? return xd;
??????? }
??????? catch
??????? {
??????????? //System.Web.HttpContext.Current.Response.Write("Error!");
??????????? return null;
??????? }
??? }
?
??? [WebMethod(Description = "insert")]
??? public bool addCar(string car_chePai)
??? {
??????? try
????? ??{
??????????? string sql;
??????????? sql = "insert into [zw_db].[dbo].tb_car(car_chePai) values(" + "'" + car_chePai + "'" + ")";
??????????? if ((car_chePai == null) || (car_chePai.Length == 0))
??????????????? return false;
??????????? else
????????? ??{
??????????????? anc.RunProc(sql);
??????????????? return true;
??????????? }
??????? }
??????? catch
??????? {
??????????? //System.Web.HttpContext.Current.Response.Write("Error!");
??????????? return false;
??????? }
??? }
?
}
这是获取资源站点信息的一个接口函数 . 里面大部分的代码 , 我想对于有一定 asp.net 基础的朋友来说 , 都应该是一看就明白。
细心的朋友可能会发现这个函数的返回类型似乎比较特殊 , 是个 xml 的文档 . 我们在前面已经说过 ,webservice 只能传输序列化数据 ,xml 显然满足条件 , 但比如 hash 表之类的非序列化数据 , 是不能传输的 ,xml 使用最为广泛 , 而且考虑到跨平台应用 , 所以这里我们只以 xml 数据的传输来示例 .
我们先简单解释下 GetSiteAData() 函数 .
?????? 函数功能很简单 , 只是要返回查询结果 , 其数据格式是 XmlDataDocument. 当查询失败时 ( 无匹配查询结果 ) ,返回一个空记录 . 否则 , 我们把查询后的 dataset 生成一个 XmlDataDocument, 接下来 , 由于该项目的需要 , 我加入了一个循环 , 添加 dataset 里所没有的节点 , 站点名称 . 在这之后 , 算是完成了一个符合我们期望格式的 xml 数据文档 , 我们把它返回 .
??????? 好了 ,webservice 的方法函数介绍完了 ( 这里还有个 web 服务方法 , 稍后介绍 ), 接下来我们的任务是怎么调用它了 . 首先把 webservice 的项目编译完成 , 假定我们这个服务是针对资源站点 A , 我们不妨称其为 ServiceA. 先单独运行 asmx 文件 , 执行 GetSiteAData() 方法 , 将提示你输入参数 , 你输入要搜索的内容 , 点确认 , 将返回给你一个 xml 数据 , 并在 ie 上显示出来 , 这就是你搜索到的内容拉 .
??????? 这里对 ServiceA 的工作再做点介绍 , 在我们这个项目里 , 它是资源站点 A 提供的服务 , 意思是 , 它查询的数据将全来源于站点 A, 而站点 A 资源添加在本项目也有专门的工程实现 .
??????? 好了 , 回到正题 . 这里我介绍 vs 调用 webservice 的方法 , 其实其他平台的调用方法也是大同小异 . 首先我们介绍 web 引用方式 , 这种方式我强烈建议调试时使用 , 非常方便 . 右击引用 , 点添加 web 引用 , 输入你的 webservice 地址 , 你必须保证你输入的 webservice 存在 . 然后引用即可 , 注意 :web 引用名将作为你加入的 webservice 的名字空间 . 比如你输入了 : localhost , 那服务的实例化将是这样 : localhost .Service1 serviceA=new localhost .Service1();(Service1 是服务的类名 ).
?????? 完成了这一步 ,service 的调用似乎变的那么简单 , 我们已经实现了远程实例化 , 接下来的远程调用也是一样的容易 . 下面给出资源采集站 ServiceGatherSite 的绑定代码 ( 只采集 A 站点的信息 )
XmlDataDocument xd = new XmlDataDocument();
??? DataSet ds = new DataSet();
??? protected void Page_Load(object sender,EventArgs e)
??? {
??????? localhost.Service ge = new localhost.Service();
?? ?????XmlNode xmlNode1;
??????? XmlDataDocument xd = new XmlDataDocument();
??????? StringBuilder xmlString1;
??????? xmlNode1 = ge.GetSiteAData();
??????? if (xmlNode1 == null) //-- 存储过程执行失败
??????????? return;
??????? xmlString1 = new StringBuilder(xmlNode1.OuterXml);
??????? if (xmlString1.ToString().Equals("<NewDataSet xmlns=/"/"></NewDataSet>"))
??????????? return;
??????? xd.LoadXml(xmlString1.ToString());
??????? ds.ReadXml(new XmlNodeReader(xd));
??????? GridView1.DataSource = ds.Tables[0].DefaultView;
??????? GridView1.DataBind() ;}
此段代码给出了 xml 转化成 dataset 的解决方案 , 虽然这不是必须的 , 但毕竟在 asp.net ,dataset 占的作用之重 , 谁都知道的 . 其他的请朋友们先看 ( 呵呵 , 个中高手就免了 )

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读