webservice接口开发.docx
《webservice接口开发.docx》由会员分享,可在线阅读,更多相关《webservice接口开发.docx(25页珍藏版)》请在冰豆网上搜索。
webservice接口开发
Microsoft.NET体系结构中非常强调WebService,构建WebService接口对.NETFramework开发工具有很大的吸引力,因此很多讲建立WebService机制的文章都是使用.NETFramework开发工具的。
在这篇文章中我们将谈论下面几个方面的问题
1、客户端怎样和WebService通信的
2、使用已存在的WebService创建代理对象
3、创建客户端。
这包括:
Web浏览器客户端
Windows应用程序客户端
WAP客户端
最好的学习方法是建立一个基于真实世界的实例。
我们将使用一个已存在的WebService,这个WebService从纳斯达克获得股票价格,客户端有一个简单的接口,该接口的外观和感觉集中了建立接口的多数语句。
客户端描述
三种客户端都接受客户输入的同一股票代码,如果请求成功,将显示公司名和股票价格,如果代码不可用,将显示一个错误信息。
客户端都设置有"GetQuote"和"Reset"按钮以初始化用户的请求。
开发中的注意事项
我使用visualstudio.NET作为我的集成开发环境,beta版没有结合.NETMobileWeb,因此,我们需要使用文本编辑器创建wap客户端,下一个版本的visualstudio.NET将整合入.NETMobileWeb。
客户端怎样与WebService通讯
我们先复习一下WebService的功能,在我得上一篇文章中曾展示一幅图(如图一),a点的用户将通过Internet执行远程调用调用b点web服务器上的东西,这次通讯由SOAP和HTTP完成。
我们实际执行了b点web服务器上的方法吗?
对于新手来说这是一个关键问题,由此你可以想到一系列的安全威胁,作为系统管理员我们不可能让随便什么人使用我们的web资源,让怀有恶意的人破坏敏感数据,而且也不能不提到带宽问题。
我们还记得这是一个分布式应用程序,因此我们还不得不关心数据的配置。
为解决这些问题,我们需要复制在用户web服务器上的对象行为,在我们的例子中,我们需要复制b点WebService针对a点的功能,这就意味着我们要创建充当原始webservcie行为的代理对象(proxyobject),这个代理对象象原始WebService那样具有所有的数据接口。
那么我们怎样得到公共数据接口的呢?
各位是否还记得WebService代码中的关键字Webonly,每一个Webonly的方法都会被复制到代理对象中,这样将保护我们的敏感数据,避免受到来自WebService终端(比如:
b点)的有恶意的黑客的攻击。
这种方法我们称为在a、b之间进行的"对象数据同步交换",这一过程称为创建"对象代理".
现在看看图1的修正版,如下图:
代理对象是WebService的基础慨念,所以创建WebService的第一步是创建代理对象,然后我们可以通过多种平台(Web浏览器,WAP,PersonalDigitalAssistant[PDA],SOAP客户端)从代理对象获得数据。
创建代理WebService对象
在.NETFramework中携带了一个创建代理对象的工具"WebServiceUtil.exe",在MS_DOS快捷窗口使用这个工具创建代理对象。
语法如下:
WebServiceUtil/c:
proxy/pa:
HTTP:
//yourDomain/someFolder/
yourWebService.asmx?
SDL
/c:
proxy
指示编译器创建一个代理对象
/pa:
<WebServerURL>
找到sdl文件的路径,最后面的"?
SDL"目的是使WebService获得SDL订约
上面的是必须要的参数,现在解释一下其他重要参数:
/disco:
<FileName>
创建一个Discovery文件,对不知道精确的url地址的用户而言,Discovery文件是找到WebService的机制之一。
它是一个提供WebService的简要说明的xml文件,visualstudio.NET工程将自动创建一个缺省的Discovery文件作为新工程的一部分,也可以启动"DynamicDiscovery"自动跟踪,
/l:
<LanguageCode>
语言可以是C#,VisualBasic或者jscript等,如:
/l:
Csharp.
/n:
<Namespace>
该类所在的名字空间。
该名字空间的所有类均可访问这个代理对象。
/o:
<Location>
表示放置创建的文件的位置。
缺省为现行目录。
/i:
<Namespace>
附加的名字空间,该名字空间是将输入该类的名字空间。
/protocol:
<protocolName>
应用的协议,如:
SOAP,HTTPGET或HTTPPOST。
缺省值为:
SOAP
下图是一个创建代理对象的例子
这个命令在当前目录下创建了一个叫LiveQuote.cs的文件。
这是一个在WebServiceClients名字空间中的C#文件,当你创建客户端时,将认识到WebServiceClients名字空间的重要性。
现在编译C#类,便产生了一个连接客户端工程的DLL文件。
,将其置于"bin"目录下。
这样就在bin目录下创建了一个叫LiveQuotes.dll的文件。
如果想了解有关编译c#类的情况可以参考.NETSDK帮助文档。
用这两个命令创建了一个代理对象,现在我们准备从WebService获得数据。
代理对象具有所有的公共接口,可访问任何商业逻辑函数,我们甚至不需要注册DLL文件就可以办到。
我们只需要编译源代码并插入bin目录下的dll文件即可。
这一切对于Web服务器访问DLL文件足够了。
如果你不熟悉ASP.NET的配置机制你也许会感到困惑,不注册dll文件是为了让操作系统验证它。
我们仅将它放在bin目录下.NETFramework在运行时将带上它。
现在我们创建客户端,创建一个客户端的步骤是:
1、创建一个代理对象的实例
2、在代理对象上执行方法调用
3、捕获从WebService返回的xml格式的数据
4、写一个特殊的客户端控件显示结果
创建Web页客户端
Web服务监听器监听HTTPGET,HTTPPOST和SOAP方法调用。
首先我们用VisualStudio.NET创建一个Web工程
打开newproject对话框,在projecttype栏选择visualc#project,在template栏中选择webapplication,创建一个新工程并在默认的web服务器下创建一个虚拟目录LiveQuotes_Clients,系统同时在DriveName/wwwroot目录下创建一个相同名字的物理目录。
2)右击工程的"References",在弹出的菜单中单击addReferences
点击"project"选项,导航到代理对象DLL
3)使用ToolboxWebformcontrols创建asp.NET文件,如果你学过vb,那么这是一件非常轻松的工作。
我将默认文件名WebForm1.aspx修改为Client_WebForm_POST.aspx,当我向web窗体插入控件时,后台自动在一个叫Client_WebForm_POST.cs的文件中生成c#代码,当引用dll文件时,我们希望系统能自动插入相关代码,但是它没有这样做,这是vs.NET试用版的一个小故障,我们需要手工输入下面这行代码以访问WebServiceClients名字空间。
usingWebServiceClients;
代理对象livequotes.DLL属于WebServiceClients名字空间,因此我们需要通过代码访问WebServiceClients名字空间,我们还需要写一些代码处理用户交互事件,比如点击按钮:
publicvoidbtn_GetQuote_Click(objectsender,System.EventArgse)
{
LiveQuotesProxyLiveQuotes=newLiveQuotes();
try
{
label_PriceValue.Text=
ProxyLiveQuotes.MSNGetLastQuote
(txt_CompanyCode.Text).ToString();
label_NameValue.Text=
ProxyLiveQuotes.MSNGetCompanyName
(txt_CompanyCode.Text).ToString();
}
catch
{
label_PriceValue.Text="0.0";
label_NameValue.Text="TheCompanydataisnotavailable";
}
}
publicvoidbtn_Reset_Click(objectsender,System.EventArgse)
{
label_PriceValue.Text="0.0";
label_NameValue.Text="";
}
完整的代码见附录1,由于可能输入错误的公司代码,因此我们用try..catch捕获错误并处理例外。
4)点击Debug->Start开始编译代码并显示浏览器
现在我们验证一下,输入一个公司代码,可以看到返回了公司名和股票价格。
默认情况下VisualStudio.NET使用Get方法,不过可以修改html表单属性将"method=POST"改为"method=GET"即可
客户端为windows应用程序
用VisualStudio.NET为WebService创建一个Windows应用程序客户端也非常容易,按照一下步骤即可:
1)打开NewProject窗口,在ProjectType栏选择VisualC#,在Templates框中选择WindowsApplication
2)右击References,在弹出的菜单中点击AddReference
3)点击.NETReferences"添加"System.Web.Services.dll,引入控制台和Web客户服务是一个好的编程习惯。
4)点击"Project",把LiveQuotes.dll作为一个引用加入工程。
5)现在该为应用程序创建窗体了,从左面的工具箱中拖放控件(如:
标签,按钮等),visualstudio.NET将在后台自动生成c#代码。
我们仅仅需要输入处理用户事件的代码即可。
(完整的代码见附录2)
protectedvoidbtn_GetQuote_Click(objectsender,System.EventArgse)
{
LiveQuoteswindowsClient=newLiveQuotes();
try
{
label_PriceValue.Text=
windowsClient.MSNGetLastQuote
(txt_CompanyCode.Text).ToString();
label_Name.Text=
windowsClient.MSNGetCompanyName
(txt_CompanyCode.Text).ToString();
}
catch
{
label_PriceValue.Text="0.0";
label_Name.Text="TheCompanydataisnotavailable";
}
}
protectedvoidbtn_Reset_Click(objectsender,System.EventArgse)
{
txt_CompanyCode.Text="";
label_Name.Text="";
label_PriceValue.Text="";
}
6)编译、执行客户端程序(visualstudio.NET的Debug->Start)
7)验证一下,输入公司代码,你将得到公司名和来自NASDAQ的股票价格
这段程序代码创建了一个代理对象,利用SOAP通过HTTP调用远程对象的函数调用,使用try..catch捕获非法的公司代码,并使应用程序转入错误处理。
构建WAP客户端
传统的wap使用纯无限标记语言(wml)编写,.NETMobileSDK使我们能够利用象asp.NET控件那样的东西设计wap接口,这样做比写wml脚本快得多。
每一个.NET可移动页面的开始都要加上下面的语句
<%PageInherits="System.Mobile.UI.MobilePage"Language="C#"%>
<%RegisterTagPrefix="Mobile"Namespace="System.Mobile.UI"%>
同样我们还是要访问livequotes.dll
<%ImportNamespace="WebServiceClients"%>
下面是完整的代码
<%PageInherits="System.Mobile.UI.MobilePage"Language="C#"%>
<%RegisterTagPrefix="Mobile"Namespace="System.Mobile.UI"%>
<%ImportNamespace="WebServiceClients"%>
<scriptrunat="server"language="c#">
protectedvoidGetQuoteCommand_OnClick(Objectsender,EventArgse)
{
LiveQuotesProxyLiveQuotes=newLiveQuotes();
try
{
Code.Text="CompanyCode-"+CompanyCode.Text;
CompanyName.Text="Name-"+ProxyLiveQuotes.MSNGetCompanyName(CompanyCode.Text);
Price.Text="Price-"+ProxyLiveQuotes.MSNGetLastQuote(CompanyCode.Text);
}
catch
{
Code.Text="CompanyCode-"+CompanyCode.Text;
CompanyName.Text="Name-Thecompanydataisnotavailable";
Price.Text="Price-"+"0.0";
}
ActiveForm=SecondForm;
}
</script>
<Mobile:
Formrunat="server">
<Mobile:
Labelrunat="server">EntertheCompanyCode:
</Mobile:
Label>
<Mobile:
TextBoxrunat="server"id="CompanyCode"/>
<Mobile:
Commandrunat="server"OnClick="GetQuoteCommand_OnClick"Text="GetQuote"/>
</Mobile:
Form>
<Mobile:
Formrunat="server"id="SecondForm">
<Mobile:
Labelrunat="server"id="Code"/>
<Mobile:
Labelrunat="server"id="CompanyName"/>
<Mobile:
Labelrunat="server"id="Price"/>
</Mobile:
Form>
微软.NETMobileWebSDK具有将IE作为WAP客户端的能力,这将加速开发过程。
我使用IE5.5模拟下面的WAP功能。
在点击GetQuote按钮后,将得到下面的页面
对所有的怀疑者而言,下面是一个熟悉的页面
我们已经讨论了构建WebService的基础,我们通过PDA和SOAP客户端打开了通往WebService的道路。
结束语
本文集中讨论了微软的web服务,微软不是这个市场的唯一玩家,ibm和sun也都在为抢占市场份额拼命努力,下面ibm和sun关于WebService的站点
IBM--HTTP:
//-106.ibm./developerworks/webservices/
Sun--HTTP:
//.sun./software/sunone/portfolio/aws.html
研究WebService时非常有兴趣的一件事,这个慨念已经叫嚷很久了,主要厂商都宣布支持WebService,但是时间将告诉我们,我们究竟能从这项技术获得些什么。
2.附录1
2.1Web客户端代码
Client_WebForm_POST.aspx
<%Pagelanguage="c#"Codebehind="Client_WebForm_POST.cs"AutoEventWireup="false"Inherits="LiveQuotes_Clients.WebForm1"%>
<html><head>
<metaname="GENERATOR"Content="MicrosoftVisualStudio7.0">
<metaname="CODE_LANGUAGE"Content="C#"></head>
<body>
<formmethod="post"runat="server"name="webServiceForm">
<tablecellspacing=1width=400border=0>
<tr>
<tdstyle="WIDTH:
16px;HEIGHT:
48px"bgcolor=#ffcc99>
<fontstyle="BACKGROUND-COLOR:
#ffcc99"
color=#ffcc99>
</font>
</td>
<tdstyle="WIDTH:
161px;HEIGHT:
48px">
<fontstyle="BACKGROUND-COLOR:
#ffcc99"
face=Verdanasize=2>
<strong>Webbrowser</strong></font></td>
<tdstyle="HEIGHT:
48px">
<fontstyle="BACKGROUND-COLOR:
#ffcc99">
<fontface=Verdanasize=2>
<strong>Client</strong>
</font>
</font>
</td>
</tr>
<tr>
<tdstyle="WIDTH:
16px"bgcolor=#ffcc99>
<fontface=Verdanacolor=#ffcc99></font></td>
<tdstyle="WIDTH:
161px">
<asp:
Labelid=lable_CompanyCoderunat="server"
font-names="Verdana"font-size="Smaller">
CompanyCode
</asp:
Label>
<fontface=Verdana></font></td>
<td>
<asp:
TextBoxid=txt_CompanyCoderunat="server"
font-names="Verdana"font-size="Smaller">
</asp:
TextBox>
<fontface=Verdana></font></td></tr>
<tr>
<tdstyle="WIDTH:
16px;HEIGHT:
30px"bgcolor=#ffcc99>
</td>
<tdstyle="WIDTH:
161px;HEIGHT:
30px">
<asp:
Labelid=label_Namerunat="server"Width="102"
Height="18"font-names="Verdana"
font-size="Smaller">
CompanyName
</asp:
Label>
</td>
<tdstyle="HEIGHT:
30px">
<asp:
Labelid=label_NameValuerunat="server"
font-names="Verdana"font-size="Smaller">
</asp:
Label>
</td>
</tr>
<tr>
<tdstyle="WIDTH:
16px;HEIGHT:
26px"bgcolor=#ffcc99>
</td>
<tdstyle="WIDTH:
161px;HEIGHT:
26px">
<asp:
Labelid=label_Pricerunat="server"
font-names="Verdana"font-size="Smaller">
Price
</asp:
Label>
</td>
<tdstyle="HEIGHT:
26px">
<