65.9K
CodeProject 正在变化。 阅读更多。
Home

让 WCF 与 Azure 协同工作

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2009年3月31日

CPOL

4分钟阅读

viewsIcon

36676

避免 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,但进行了必要的更改以确保它能够正常工作。

  1. 打开您在练习 2 中创建的项目,或者打开位于 C:\AzureServicesKit\Labs\BuildingWindowsAzureServices\Ex03-HostingWCFService\begin\begin.sln 解决方案文件。

    注意

    如果您关闭了 Visual Studio,请确保以 **管理员** 身份打开它,方法是:从 **开始 | 所有程序 | Microsoft Visual Studio 2008 右键单击 Microsoft Visual Studio 2008** 并选择 **以管理员身份运行**。

  2. 添加 WCF 服务文件。为此,请在 **解决方案资源管理器** 中右键单击 RDCompute_WebRole 节点,指向 **添加**,然后选择 **新建项**。在 **添加新项** 对话框中,选择 **WCF 服务** 模板,将名称更改为 MessageLogger.svc,然后单击 **添加**。

    Add New Item

    注意

    该模板会添加一个 IMessageLogger 接口,该接口定义了服务契约,以及一个实现该契约的 MessageLogger 类。

  3. 更新契约接口以定义一个将消息发送到服务的方法。在文本编辑器中打开 IMessageLogger.cs 文件。该文件包含生成的 IMessageLogger 接口,其中包括一个名为 DoWork 的单个方法。删除此方法,并插入 LogMessage 方法来替换它(如下面粗体字所示)。
    public interface IMessageLogger 
    { 
     [OperationContract]
     void LogMessage(string message); 
    
     }
  4. MessageLogger 服务中实现契约接口。在文本编辑器中打开 MessageLogger.svc.cs 文件。该文件包含服务实现,并包含一个骨架 DoWork 方法。同样,删除此方法,并在其位置插入以下代码,实现 LogMessage 方法。
    public void LogMessage(string message) 
    { 
         MessageHelper.SaveMessage(message); 
    } 
  5. 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>
  6. 右键单击 ASP.NET 项目(AzureWCFDemo_WebRole)并将其设置为启动项目。
  7. 右键单击 MessageLogger.svc 文件,然后选择在浏览器中查看。
  8. 当 Internet Explorer 启动时,将地址栏中显示的地址复制到剪贴板。
  9. 启动一个新的 Visual Studio 实例。
  10. 通过选择 文件,新建项目 来创建一个控制台客户端项目。

    image

  11. 添加对消息日志记录服务的引用。在 **解决方案资源管理器** 中,右键单击 MessageGenerator 项目节点,然后选择 **添加服务引用**。将您从 Internet Explorer 实例复制的地址粘贴到 **添加服务引用** 对话框中,然后单击发现。将 Namespace 更改为 RDService ,然后单击 **确定**。
  12. 将以下代码添加到 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); 
           } 
         } 
       } 
  13. 返回运行 ASP.NET 应用程序的 Visual Studio 实例,并停止调试 ASP.NET 应用程序。
  14. 右键单击 Azure 项目并将其设置为启动项目,然后开始调试。Dev Fabric 应该开始运行并托管 WCF 服务。当 Internet Explorer 启动时,记下端口号。很可能这是 81。
  15. 最后,回到我们的客户端项目。打开 app.config 文件,并将终结点地址更改为上一步中找到的端口号。
  16. 现在运行客户端项目。它应该能够调用托管在开发环境中的 WCF 服务。

    如果一切顺利,您应该已经完成了练习 3。希望问题能尽快得到解决。

© . All rights reserved.