让 WCF 与 Azure 协同工作





0/5 (0投票)
避免 Azure CTP 中的 WCF 问题。
Silverlight 可以轻松地创建引人注目的富 Internet 应用程序。也就是说,.NET 的精简版本意味着您在应用程序中进行的一些操作必须委托给 Web 服务,而 Web 服务可以利用完整的 .NET 库。其中之一当然是 Azure,毕竟,这才是重点——业务逻辑和数据的在线存储。
我正在开发的应用使用 Silverlight 作为前端,Azure 将提供大部分后端。这样做的原因有很多;我的网站预算不是很大,采用 Azure 首先意味着在开发期间是免费的,但几乎同样重要的是——托管成本将与网站的成功程度相关。
问题是处理预发布软件意味着我添了不少白发,仅剩的头发也越来越少。需要关注的一个方面是 WCF。如果您运行 Azure Labs,WCF 实验将无法正常工作。这是因为开发环境未能正确托管服务,并且 WCF 元数据也未能正确返回。
感谢 David Burela 和他的 House-o-blog。在他的博客中,他描述了一种在开发环境出现问题的情况下使 WCF 正常工作的方法。所以我想我会编写一个 Azure Services Training Kits 练习 3:托管 WCF 服务 的版本。
所以以下是练习 3,但进行了必要的更改以确保它能够正常工作。
- 打开您在练习 2 中创建的项目,或者打开位于 C:\AzureServicesKit\Labs\BuildingWindowsAzureServices\Ex03-HostingWCFService\begin\ 的 begin.sln 解决方案文件。
注意
如果您关闭了 Visual Studio,请确保以 **管理员** 身份打开它,方法是:从 **开始 | 所有程序 | Microsoft Visual Studio 2008 右键单击 Microsoft Visual Studio 2008** 并选择 **以管理员身份运行**。
- 添加 WCF 服务文件。为此,请在 **解决方案资源管理器** 中右键单击
RDCompute_WebRole
节点,指向 **添加**,然后选择 **新建项**。在 **添加新项** 对话框中,选择 **WCF 服务** 模板,将名称更改为 MessageLogger.svc,然后单击 **添加**。注意
该模板会添加一个
IMessageLogger
接口,该接口定义了服务契约,以及一个实现该契约的MessageLogger
类。 - 更新契约接口以定义一个将消息发送到服务的方法。在文本编辑器中打开 IMessageLogger.cs 文件。该文件包含生成的
IMessageLogger
接口,其中包括一个名为DoWork
的单个方法。删除此方法,并插入LogMessage
方法来替换它(如下面粗体字所示)。public interface IMessageLogger { [OperationContract] void LogMessage(string message); }
- 在
MessageLogger
服务中实现契约接口。在文本编辑器中打开 MessageLogger.svc.cs 文件。该文件包含服务实现,并包含一个骨架DoWork
方法。同样,删除此方法,并在其位置插入以下代码,实现LogMessage
方法。public void LogMessage(string message) { MessageHelper.SaveMessage(message); }
- 将
IMessageLogger
终结点的绑定更改为使用basicHttpBinding
。在文本编辑器中打开 Web.config 文件,并在system.serviceModel
下的 services 部分找到RDCompute_WebRole.MessageLogger
服务配置。这应该在文件的末尾附近。将此部分中包含的单个终结点的 binding 属性从wsHttpBinding
更改为basicHttpBinding
。更改后的终结点配置应如下所示<endpoint address="" binding="basicHttpBinding" contract="RDCompute_WebRole.IMessageLogger"> <identity> <dns value="localhost" /> </identity> </endpoint>
- 右键单击 ASP.NET 项目(
AzureWCFDemo_WebRole
)并将其设置为启动项目。 - 右键单击 MessageLogger.svc 文件,然后选择在浏览器中查看。
- 当 Internet Explorer 启动时,将地址栏中显示的地址复制到剪贴板。
- 启动一个新的 Visual Studio 实例。
- 通过选择 文件,新建项目 来创建一个控制台客户端项目。
- 添加对消息日志记录服务的引用。在 **解决方案资源管理器** 中,右键单击
MessageGenerator
项目节点,然后选择 **添加服务引用**。将您从 Internet Explorer 实例复制的地址粘贴到 **添加服务引用** 对话框中,然后单击发现。将Namespace
更改为RDService
,然后单击 **确定**。 - 将以下代码添加到 main 函数中
using (RDService.MessageLoggerClient client = new RDService.MessageLoggerClient()) { Console.WriteLine("Enter your messages ('quit' to exit)"); while (true) { try { string message = Console.ReadLine(); if (message.Equals("quit", StringComparison.CurrentCultureIgnoreCase)) break; client.LogMessage(message); } catch (Exception ex) { Console.WriteLine(ex.Message); } } }
- 返回运行 ASP.NET 应用程序的 Visual Studio 实例,并停止调试 ASP.NET 应用程序。
- 右键单击 Azure 项目并将其设置为启动项目,然后开始调试。Dev Fabric 应该开始运行并托管 WCF 服务。当 Internet Explorer 启动时,记下端口号。很可能这是 81。
- 最后,回到我们的客户端项目。打开 app.config 文件,并将终结点地址更改为上一步中找到的端口号。
- 现在运行客户端项目。它应该能够调用托管在开发环境中的 WCF 服务。
如果一切顺利,您应该已经完成了练习 3。希望问题能尽快得到解决。