首页 > 编程开发 > Objective-C编程 >
-
c# Builder 构建Web服务和客户端
Web服务很酷;Web方法也风靡一时。但是它们仅仅是另一个短时间流行的技术,一个无永久价值的事物吗?如果我们忽视它们足够久,它们能消失吗?不,这个技术有持久的生命力,到处都有使用它编写的东西。它不仅仅是炒作。 Web服务是开发技术的瑞士军刀上的一个真正有用的刀刃。使用何种方法呢?
利用Web服务,你不需要重新开发不属于你的程序设计语言的内部功能或者开发工具运行时间库的功能,然而公共的功能足够对许多--至少有一些开发者来说是够用了。 而且,在很多情况下Web服务的返回值是动态的,比如给定邮政编码地区的天气情况、当前时间、这个或那个东西的价格、道路状况等等。在这些情况下,无论如何,你都将访问一些动态信息源(从因特网上读取),所以消费一个已经创建来提供你的应用程序需要的信息的Web服务就很少或者没有性能缺陷了。
在本示例中,我们将创建一个返回任何给定日期是星期几这样的Web服务(在.NETspeak中,一个"Web方法")。 我们还将创建一个WinForm客户端,传递所需的年、月和日的值到这个Web方法中。
创建Web Method/Service
启动C# Builder,选择File|New | Other | ASP.NET Service Application
改名为"DOW",意思是"Day Of the Week"。
创建两个文件:WebService1.asmx和WebService1.asmx.cs。选择File | Save As,并且另存WebService1.asmx为DOW.asmx。这还将改变*.cs文件为DOW.asmx.cs。
如果你此时就想运行这个工程,那么你将得到错误信息"unable to attach to ASP.NET process ( typically aspnet_wp.exe)"。在Project Manager中右击DOW.asmx,并且选择"Set as start page"。 现在如果你运行它,你将得到一个IE里的页面,如下:
改变你的*.asmx和*.asmx.cs的Web方法(WebService1)的默认名为DOW。 此外,添加下面的属性(使用你的名称替换我的)。
public class DOW: System.Web.Services.WebService:
[WebService(Namespace="http://www.ClayShannon.com")
删除DOW.asmx.cs文件中的位置标志符web methods(注释掉),并且在unit的底部添加下面的方法和属性:
[WebMethod]
public string GetDow(int intYear, int intMonth, int intDay)
{
DateTime d8 = new DateTime(intYear, intMonth, intDay, new GregorianCalendar());
GregorianCalendar gregCal = new GregorianCalendar();
return gregCal.GetDayOfWeek(d8).ToString();
}
此外,在unit的顶部添加下面的代码:
Using System.Globalization;
现在,当你运行这个应用程序的时候,你将在你的web浏览器中看到下面这个屏幕:
单击ServiceDescription,显示Web方法后的SOAP XML:
单击GetDow显示这个页面:
C# Builder允许你从Web方法/服务本身测试你的Web方法。 你不必首先创建一个客户端来测试它,这样多省时间呀,因为不这样的话你就要在Web服务工程和客户端工程之间来回切换。
下面是我输入一些测试数据并选择Invoke按钮后的结果的屏幕截图:
顺便说一下,www.ClayShannon.com是一个虚构的URL(它是一个上面显示的WebService NameSpace属性中的位置标志符)。然而幸运的是,C# Builder不计较URL的真伪,它仍然返回正确结果。
Web方法/服务已经成功地创建。DOW.dll已经在C:InetpubwwwrootDOWbin中创建。 现在,让我们编写一个简单的客户端来调用这个方法。
创建客户端
选择File | New C# Application。设计器上将显示一个WinForm。
选择Project | Add Web Reference。UDDI浏览器对话框将显示:
输入下面的URL到对话框最上端的URL编辑框:
http://localhost/DOW/DOW.asmx
选择URL编辑框左方的"Go"(右箭头)按钮。进度条和它的附属标签在UDDI对话框的左下角,让你了解它正在打开页面。 它如何将显示你以前在你的浏览器中看到的相同的HTML页面:
选择Add Reference按钮。这将添加一些文件到你的工程中。 你可以在Project Manager中看到--展开References,Web Reference和Local Host节点,查看创建了什么,以及什么被添加到你的工程中。 System.XML.dll已经被作为一个子节点添加到References节点上,DOW.wsdl以及Reference.map被添加到localhost节点上,并且Reference.cs源码文件已经被添加到Reference.map下。
现在让我们取得图形用户界面并且添加三个标签组件,三个文字框组件和一个按钮组件到这个WinForm上。就象Delphi-和或许其他的Borland开发工具-一样,你可以在按住Shift键的同时单击一个工具箱组件,这样你就可以根据你的需要在窗体上添加许多类型的组件了。在你完成特别种类组件的之后,单击工具板最上端的North-by-Northwest指向箭头来取消选定组件。
改变Label组件的文本属性分别为Year、Month和Day。改变所有的Text Box组件的文本属性为一个空字符串和它们的名称为tbYear、tbMonth和tbDay。改变Button组件的Layout.Size.Width属性为100。改变窗体的Layout.Size.Height属性为220。整理一下组件,让它们相互排列更整齐一些。你的设计期窗体看上去应该如下图所示:
通过选择Project | Add Reference | Project References,添加你前面创建的Web方法到你的客户应用程序的References中,然后选择Browse按钮导航到DOW.dll文件。现在添加using DOW;到你的主窗体(默认名为WinForm.cs)的using子句中。
最后,双击Button并且添加下面的代码到它的单击事件中:
private void button1_Click(object sender, System.EventArgs e)
{
int AYear = Convert.ToInt32(this.tbYear.Text);
int AMonth = Convert.ToInt32(this.tbMonth.Text);
int ADay = Convert.ToInt32(this.tbDay.Text);
try
{
DOW localdow = new DOW();
MessageBox.Show(localdow.GetDow(AYear, AMonth, ADay));
}
catch (Exception x)
{
MessageBox.Show(x.Message,
"Something is rotten in Denmark!");
}
}
}
当你输入有效的值到文字框组件中,然后选择Button,你将得到一条从GetDOW Web方法返回的消息,告诉你输入的日期相当于一周中的哪一天:
可能在你第一次调用这个Web方法的时候要花费几秒钟的时间,但是后面连续调用就快的多了。
我们知道有一个正在工作的Web方法/服务,以及一个使用,或者"消费"它的客户端。 超出本文范围的是接下来的发布步骤,或者是在一个Web服务主机站点例如 www.xmethods.com上展示Web方法。
此外,在真正付诸使用之前,还应该添加测试传送到Web方法中的参数,也就是保证它们是适当的取值范围的有效正整数(例如1..12用于月、1..31用于日)。 当然,为了让这个例子简单化,我们假设你绝对不会输入类似于"yabba dabba doo"、"-7"、"3.14"这样的古怪的值。
改变你的*.asmx和*.asmx.cs的Web方法(WebService1)的默认名为DOW。 此外,添加下面的属性(使用你的名称替换我的)。
public class DOW: System.Web.Services.WebService:
[WebService(Namespace="http://www.ClayShannon.com")
删除DOW.asmx.cs文件中的位置标志符web methods(注释掉),并且在unit的底部添加下面的方法和属性:
[WebMethod]
public string GetDow(int intYear, int intMonth, int intDay)
{
DateTime d8 = new DateTime(intYear, intMonth, intDay, new GregorianCalendar());
GregorianCalendar gregCal = new GregorianCalendar();
return gregCal.GetDayOfWeek(d8).ToString();
}
此外,在unit的顶部添加下面的代码:
Using System.Globalization;
现在,当你运行这个应用程序的时候,你将在你的web浏览器中看到下面这个屏幕:
单击ServiceDescription,显示Web方法后的SOAP XML:
单击GetDow显示这个页面:
C# Builder允许你从Web方法/服务本身测试你的Web方法。 你不必首先创建一个客户端来测试它,这样多省时间呀,因为不这样的话你就要在Web服务工程和客户端工程之间来回切换。