天天看点

《微软云计算Windows Azure开发与部署权威指南》——6.7 AppFabric服务总线REST的服务开发

本节书摘来自异步社区《微软云计算windows azure开发与部署权威指南》一书中的第6章,第6.7节,作者: 尹成 , 郝庭毅 , 张俊强 , 孙奉刚 , 寇睿明 更多章节内容可以访问云栖社区“异步社区”公众号查看。

微软云计算windows azure开发与部署权威指南

本节介绍如何建立一个简单的服务总线主应用程序,使该程序公开一个基于rest的访问接口。任一台web客户端,比如浏览器,都可以使用http请求访问服务总线api。本示例使用的是wcf rest编程模型在服务总线上构建rest服务。

1.步骤一:注册账户

① 在windows azure门户创建一个服务命名空间。可参考本章6.2小节的内容。

② 在windows azure management门户主窗口中单击选中创建的命名空间。

③ 在左侧的“properties”面板中找到“default key”入口。

④ 在“default key”中单击“view”,记下或复制密钥,以在之后的操作中使用。

2.步骤二:定义一个基于rest的服务契约

① 以管理员身份运行visual studio 2010,选择新建工程,选择visual c#,创建一个控制台应用程序,命名为“imagelistener”,如图6-68所示。

② 添加对system.servicemodel.dll的引用到该工程。在解决方案资源管理器中,右键单击“引用”,选择“添加引用”,在弹出的对话框中选择“.net”选项卡,找到system.servicemodel.dll,选中,单击“确定”按钮。

③ 用同样的方法添加system.servicemodel.web.dll的引用。

《微软云计算Windows Azure开发与部署权威指南》——6.7 AppFabric服务总线REST的服务开发

④ 在program.cs中添加如下命名空间的引用。

通过system.servicemodel命名空间可以使用wcf的基本功能,服务总线使用了很多wcf的对象和属性定义契约,所以在大多数服务总线应用程序中都用到该命名空间。system.servicemodel.channels命名空间帮助定义通道,通过通道与服务总线和客户的web浏览器通信。system.servicemodel.web包含了建立基于web应用程序的数据类型。

⑤ 将visual studio默认的命名空间改为microsoft.servicebus.samples。

⑥ 在命名空间里定义一个名为“iimagecontract”的接口,在接口中声明一个名为“getimage”的方法,作为最后要公开的接口方法。代码如下:

这样就允许服务总线将http get请求路由到getimage方法上,并将getimage方法的返回值转换成http getresponse回复。

⑦ 在“iimagecontract”接口定义的下面,声明一个继承了iimagecontract和iclientchannel的通道,具体代码如下。

channel是一个wcf对象,是服务端和客户端互相传递信息的通道。之后,主机应用程序会创建一个通道,服务总线就会通过这个通道将来自浏览器的http get请求传递给getimage方法。服务总线也通过这个通道得到getimage方法返回的值,并转换成要返回给浏览器的http getresponse。

⑧ 按f7键生成解决方案,以确保正确。最后的代码如下:

3.步骤三:实现基于rest的wcf服务契约

① 在“iimagecontract”接口下面创建一个名为“imageservice”的类,该类实现“iimagecontract”接口。具体代码如下:

② 向工程里添加一个jpg格式的图片。右键单击工程,选择“添加”→“现有项”,在弹出的文件选择对话框中选择本地的一张jpg图片,注意文件类型过滤条件要选择all files(.)以方便选择jpg文件。本例添加图片名称为“penguins.jpg”。

③ 为确保运行时的服务能找到图像文件,在解决方案资源管理器中右键单击添加的图片,在属性中设置“复制到输出目录”的值为“如果较新则复制”,如图6-69所示。

《微软云计算Windows Azure开发与部署权威指南》——6.7 AppFabric服务总线REST的服务开发

④ 在工程中添加对system.drawing.dll、system. runtime.serialization.dll、microsoft.servicebus.dll的引用,可参考步骤二的序号②。microsoft. servicebus.dll可以在windows azure sdk目录下找到,然后在program.cs中添加对如下命名空间的引用。

⑤ 在imageservice中添加构造方法来加载位图,以准备将图片发送至客户端浏览器。

⑥ 在imageservice类中添加getimage()方法,返回值为包含了返回图片的http消息。

getimage方法体中使用memorystream检索图像和准备流。

⑦ 右键单击imagelistener工程,选择“添加”→“新建项”,在添加新建项对话框中选择应用程序配置文件,单击“添加”,如图6-70所示。

《微软云计算Windows Azure开发与部署权威指南》——6.7 AppFabric服务总线REST的服务开发

⑧ 打开app.config文件,具体内容如下:

⑨ 在根节点中添加名为“system.servicemodel”的子节点,这是wcf的元素,用来定义一个或者多个服务。在这里用来定义服务名称和端点。

⑩ 在“system.servicemodel”中添加名为“binding”的子节点,它用来定义程序中使用的绑定,可以定义多个,但在本例中只需要一个,具体代码如下。

该代码定义了一个relayclientauthenticationtype为none的webhttprelaybinding服务总线绑定,这表明使用此绑定的端点不要求客户端提供证书。

11 在“binding”元素后面再添加“services”元素,同样可以定义多个,但本例只需要一个,具体代码如下。

这段代码配置了使用之前定义的webhttprelaybinding的一个服务。它使用默认的sharedsecretcredentials,这将在下一步中定义。

12 在“services”元素后面再添加一个“behaviors”元素,代码如下,将“issure_name”和“issure_secret”替换为发行名字和密钥。

sharedsecretclientcredentials行为定义了服务用来访问服务总线所使用的证书,即sharedsecret。

13 windows azure sdk 1.5版本不再将条目添加到machine.config文件,故需要手动将用到的扩展名添加到项目的app.config文件中,在system.servicemodel元素里添加如下代码。注意version的值要与读者引用的microsoft.servicebus.dll的版本一致。

14 按f7键,生成解决方案。

最终program.cs的代码如下:

最终app.config的内容如下。

4.步骤四:将该基于rest的服务托管到服务总线

① 创建服务的基地址。在main()方法中创建一个变量用来存放服务总线工程的服务命名空间。根据此服务命名空间生成uri。

② 创建和配置该web服务的主机。使用生成的uri地址创建web服务主机。

③ 运行web服务主机。打开服务,给出提示,结束后关闭服务。最后main()中代码如下:

④ 图6-71所示为运行结果。图6-72所示为最终的界面。

《微软云计算Windows Azure开发与部署权威指南》——6.7 AppFabric服务总线REST的服务开发

https://yqfile.alicdn.com/188d0635fe9b5cf8a6646c99b84161818f95db29.png" >

继续阅读