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

XBAP 中的 WCF 入门指南

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (21投票s)

2008年7月9日

CPOL

10分钟阅读

viewsIcon

137740

downloadIcon

2109

本文介绍如何在 XBAP 或 WPF 浏览器应用程序中使用 WCF 服务。

目录

开发平台

  1. Visual Studio 2008
  2. .NET Framework 3.5
  3. IIS 5.1~7
  4. IE7/Firefox 2.x
  5. ASP.NET 2.0
  6. Windows Vista/XP

引言

Windows Presentation Foundation,简称 WPF,是微软新的用户界面技术。WPF 随着 .NET Framework 3.0 的发布而引入。WPF 带来了许多承诺;例如,它可用于展示非常丰富的以图形为中心 2D 和 3D 模型。WPF 充分利用客户端计算机的图形能力。有关 WPF 的更多信息,请访问 www.windowclient.net。本文将讨论如何在 Web 中使用 WPF!这听起来似乎是一个非常奇怪的愿望。但这是真的;WPF 可以在浏览器中使用。这种特殊的以浏览器为中心的包称为 WPF 浏览器应用程序。XBAP 是 XAML 浏览器应用程序的缩写,它是 WPF 浏览器应用程序的最终输出。XBAP 的主要目的是引入一个胖客户端应用程序,该应用程序在客户端运行,并在 Web 中提供桌面应用程序的便利性。XBAP 使用客户端计算机的资源,因此必须在客户端计算机上安装 .NET Framework 才能运行 WPF 浏览器应用程序。尽管 XBAP 使用客户端计算机的资源和内存,但它在沙盒环境中运行。这种沙盒模式称为部分信任模式。与 3.0 相比,.NET 3.5 中的 XBAP 有一些改进。在部分信任模式下使用 WCF 是其中之一。本文将介绍在 XBAP 部分信任模式下实现 WCF 服务。

准备工作

通过学习示例来学习新事物始终是一种非常好的方式,因此我们将开发一个简单的 XAML 浏览器应用程序,其中我们将显示用户的待办事项列表和笔记,当然,还将使用 WCF 与我们的数据层进行通信。在进入正题之前,有几件事情必须明确。在部分信任模式下,XBAP 只能从源站点消费 WCF 服务。因此,我们无法使用跨域的 WCF 服务。WCF 绑定配置方面我们也有限制。在部分信任模式下,我们只能使用 BasicHttpBindingWSHttpBinding。对于检索、创建、删除和更新任务,我们将使用 BasicHttpBinding。另一方面,对于检索、创建、删除和更新笔记,我们将使用 WsHttpBinding。让我们先来看项目模板。我们将创建一个 WPF 浏览器应用程序项目。然后,创建一个 WCF 服务应用程序项目,最后,我们将开发一个简单的网站(VS2008 的 Web 应用程序项目),我们的浏览器应用程序将在其中托管。我们将使用 SQL Server Express 版数据库作为数据服务层,名为“tododata.mdf”。我们将构建自己的用户基础和用户验证。WPF 浏览器应用程序会将所有请求转发到 WCF Web 服务。WCF 服务将执行业务逻辑验证并从数据访问层检索数据。下图展示了应用程序架构示意图:

XBAP-WCF.JPG

创建项目和必要文件

到目前为止,我们已经知道我们将创建三个不同的项目。所以,让我们开始吧。为了方便起见,我们将从创建一个空白解决方案开始。继续在 VS2008 中创建一个空白解决方案,并将解决方案保存在一个方便的位置,并取一个方便的名称。然后,向解决方案添加一个新的 WPF 浏览器应用程序项目。接着,添加一个新的 WCF 服务应用程序,最后添加一个新的 Web 应用程序项目。这样就完成了项目创建过程。为了保存数据,我们将使用 SQL Server Express 数据库。所以,让我们继续添加一个 SQL Server 数据库文件,并根据您的喜好命名。然后,为任务、笔记和用户创建必要的表。接下来,我们需要一个简单的机制来从数据库检索、保存和修改数据;为此,我们将使用 LINQ。为 WCF 服务项目添加一个 DBML 文件,并将数据库表从数据库资源管理器拖放到 DBML 中。接下来,我们需要定义我们的服务接口。我们将在同一个 WCF 项目中有两个服务:一个用于笔记(INoteService),另一个用于任务(ITaskService)。

Projects.jpg

配置 XBAP 的 WCF

如果您是 WCF 新手,我建议您花一些时间在 MSDN 库中学习 WCF。现在,我们有了 WCF 服务应用程序“WcfService”。我们将配置我们的 WCF 服务,以便我们的 XBAP 可以消费该服务。默认情况下,当用户添加 WCF 服务时,Visual Studio 会自动为该服务配置两个终结点。我们将修改我们服务的绑定配置,以便 XBAP 可以与它通信。Visual Studio 2008 提供了一个很好的工具来编辑 WCF 服务配置,该工具称为“WCF 服务配置编辑器”。我们将使用此工具编辑服务配置。您也可以手动修改 web.config 文件,在 ServiceModel 部分设置适当的标记。默认情况下,当您右键单击服务项目的 web.config 时,不会显示编辑配置工具。要使其显示,首先,我们必须从 Visual Studio 2008 的“工具”菜单中运行它。点击 Visual Studio 2008 的“工具”菜单,然后点击 WCF 配置菜单。现在,您可以关闭该工具。一旦打开该工具,它将在当前会话中可用。现在,右键单击 WCF 服务项目的 web.config 文件,然后选择“编辑 WCF 配置”。配置编辑器将弹出,其中包含 web.config 中定义的所有配置。在配置编辑器中,左侧会有一个包含服务信息的树。展开“服务”节点,您将看到一个名为“Endpoints”的节点。默认情况下,在 Endpoints 节点下,有两个预先添加的终结点,一个配置为 WsHttpBinding,另一个配置为 MaxHttpBinding。现在,选择配置为 WsHttpBinding 的终结点。选择该终结点后,该终结点的属性将在右侧的属性编辑器中显示。将绑定属性从 WsHttpBinding 更改为 BasicHttpBinding。点击文件,然后保存并关闭该工具。

ServiceConfigurationEditor.jpg

现在,是时候将服务托管到一个位置,以便我们的应用程序可以从固定位置消费它了。当我们添加 WCF 服务应用程序时,默认情况下,Visual Studio 2005/2008 会将服务配置为在 Visual Studio 开发服务器上运行。我们将将其修改为从 IIS 运行。为此,右键单击 WCF 服务项目,然后选择“属性”。在项目属性窗口弹出后,导航到“Web”选项卡,并在“服务器”部分下将服务器配置从“使用 Visual Studio 开发服务器”更改为“使用 IIS Web 服务器”。之后,您需要点击“创建虚拟目录”按钮来完成此过程。然后,保存项目。这样,您就完成了为 XBAP 配置服务的所有工作。如果您使用的是 Windows Vista,可能会遇到一些错误;要解决这些问题,您必须以“以管理员身份运行”模式启动 Visual Studio。

从 XBAP 消费 WCF 服务

困难的部分现在已经结束了。只需添加服务引用;右键单击项目,选择“添加服务引用”。在服务引用窗口弹出后,点击“发现”按钮。您可以选择服务,URL 将添加到地址文本框中。点击“确定”,您就完成了。由于执行了之前的操作,适当的标记将被添加到 app.configserviceModel 配置部分。添加的标记如下所示:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" 
                sendTimeout="00:01:00"
                allowCookies="false" bypassProxyOnLocal="false" 
                hostNameComparisonMode="StrongWildcard"
                maxBufferSize="65536" maxBufferPoolSize="524288" 
                maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" 
                transferMode="Buffered"
                useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" 
                    maxArrayLength="16384"
                    maxBytesPerRead="4096" 
                    maxNameTableCharCount="16384" />
                <security mode="None">
                    <transport clientCredentialType="None" 
                          proxyCredentialType="None" realm="" />
                    <message clientCredentialType="UserName" 
                             algorithmSuite="Default" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://munna.kaz.com.bd/TODO.SERVICE/Service1.svc"
            binding="basicHttpBinding" 
            bindingConfiguration="BasicHttpBinding_IService1"
            contract="TodoServiceReference1.IService1" 
            name="BasicHttpBinding_IService1" />
    </client>
</system.serviceModel>

调试 WCF 服务

在开发 XBAP 时,开发人员有时需要调试应用程序。开发人员可能需要检查服务接收了什么数据,以及服务传输了什么数据。好吧,由于 WCF 在 XBAP 中仅在部分信任模式下运行,这变得有点困难,但也不是不可能。从 Visual Studio 2008 进行调试时,我们可以将“信任模式”设置为完全信任。您可以在项目属性的“安全”选项卡中将信任模式设置为完全信任。这将使您的 WPF 项目能够在开发环境中调试应用程序。但是,在部署期间,您必须将信任模式改回部分信任;否则,您可能会收到信任未授予的错误。

部署您的解决方案

首先,开发人员需要将 XBAP 的安全模式设置为部分信任。在发布向导中,第一步是指定要发布二进制文件的位置。浏览并选择一个方便的文件夹。点击“下一步”,下一个选项是选择用户将如何安装应用程序。在此屏幕上,开发人员需要选择“从网站”选项,并指定网站的位置。浏览或填写网站的位置。部署解决方案时,您必须注意部署 URL 和 XBAP 的 app.confiq 中定义的 WCF 服务的 URL。在 app.config 中,假设您有一个终结点,地址为 https:///wcfservice。您还应该将 XBAP 部署 URL 设置为 https:///xbaphost。如果您在 app.config 中有 localhost,但您浏览的是 http://{pcname}/xbaphost,事情将无法正常工作,您将最终收到一个代码访问安全违规异常。因此,您必须保持 WCF 服务和 XBAP 主机的 URL 一致。

PublishWizard.jpg

使用 WsHttpBinding 配置

您也可以使用 WsHttpBinding 与 WCF 进行通信,但需要配置一些事项,以确保您不会遇到代码访问安全异常。如果您想使用 WsHttpBinding,则无需创建任何新的绑定。Visual Studio 2008 默认会为 WCF 服务应用程序创建两个终结点:WsHttpBindingMaxHttpBinding。开发人员需要做的是配置一个新的绑定配置。为此,请编辑 WCF 服务应用程序的 web.config 文件。在默认窗口中,您将看到第一个终结点配置为 WsHttpBinding,在该终结点下,有一个默认的绑定配置。它应该显示“(默认) 点击创建”。只需点击创建一个新的绑定配置,并将其配置为不使用可靠会话,并将安全模式设置为 None。下图显示了服务模式配置,以便更好地理解;最终,WCF 配置编辑器将生成此类标记。

<system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="NewBinding0" messageEncoding="Text">
          <reliableSession enabled="false"/>
          <security mode="None">
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="TESTWCF.Service1Behavior" name="TESTWCF.Service1">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="NewBinding0"
          contract="TESTWCF.IService1">
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="TESTWCF.Service1Behavior">
          <serviceMetadata httpGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
</system.serviceModel>

请确保在客户端终结点和服务的终结点绑定配置中都禁用可靠会话并将安全模式设置为“None”。否则,XBAP 可能会遇到代码访问安全异常。

关于数据传输限制的简要讨论

XBAP 与 WCF 通信的数据传输在数据传输大小方面有一些限制。如果您传输的对象列表很大,超过了 web.configmaxBufferSizemaxReceivedMessageSize 指定的大小,应用程序将导致接收限制超出的异常。您可以从服务的绑定配置部分的 web.config 中增加 maxBufferSizemaxReceivedMessageSize 的大小,但增加大小将导致应用程序出现代码访问权限异常。因此,逃避此问题的一个非常直接的方法是使您的服务能够不返回超出大小限制的数据。并且,如果您有大量数据需要传输,请修改服务约定,以便您可以分多次请求传输数据,并且每次请求的大小限制都应保持在 maxBufferSize 以下。

结论

在某些情况下,您会发现服务响应您的请求需要一些时间,这可能导致您的应用程序在几秒钟内无响应。要避免此问题,您可以使用后台进程调用 WCF 服务,向用户显示等待屏幕,并在进程完成执行后隐藏等待屏幕。这就结束了 XBAP 与 WCF 通信的入门介绍。

© . All rights reserved.