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

使用 Visual Studio 2008 构建 Web 消息板 - 第二部分 - 使用 Microsoft Word 发布消息

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (39投票s)

2007 年 12 月 28 日

CPOL

23分钟阅读

viewsIcon

174645

downloadIcon

1339

本文使用 Visual Studio Tools for Office 构建一个 Word 文档模板,该模板可用于向留言板发布消息。

引言

本文是系列文章“使用 Visual Studio 2008 构建 Web 留言板”的第二部分。本系列的第一部分可在此处访问

目录

本文演示的 Visual Studio 2008 功能

本文演示了 Visual Studio 2008 的以下功能:-

  1. 客户端应用程序服务 - ASP.NET 2.0 引入了成员资格、配置文件和角色服务。成员资格允许您维护站点用户,配置文件允许您存储每个用户的个性化数据,角色允许您为用户指定一个或多个角色以用于基于角色的安全目的。ASP.NET AJAX 允许您从 Web 应用程序中的 JavaScript 访问这些服务。使用 Visual Studio 2008,这些服务可从任何客户端应用程序访问:Windows Forms、WPF 或 Office。客户端应用程序可以使用易于使用的 API 访问远程 Web 服务器上的这些服务。
  2. Office 2007 文档模板 - Visual Studio 2008 Tools for Office 允许您将程序集与 Office 2007 文档或文档模板关联。程序集可以控制或访问文档的各个部分并添加自定义行为。例如,在本文中,我们将看到如何从 Word 文档的特定区域提取主题和消息文本并发布到留言板。

让我们首先看看我们在文章中构建了什么,然后我们可以看到构建它所涉及的步骤。

使用 Microsoft Word 发布消息

在本文中,我们将构建一个 Microsoft Word 文档模板。用户可以使用此模板创建 Word 文档。创建的 Word 文档将具有占位符,用户可以在其中键入消息主题和消息文本。用户完成消息键入后,可以单击标记为“发布消息”的功能区按钮。这将导致消息发布到“留言板”网站。以下屏幕截图演示了所有组件

Template showing place holders

发布消息”功能区按钮仅适用于使用自定义文档模板开发的文档。任何其他 Word 文档将以正常方式出现,即,它将没有“发布消息”按钮。在继续之前,让我们看看我们为什么要费力构建自定义 Word 文档模板的原因。

为什么要使用 Microsoft Word?

很多次我为留言板准备了一个精心设计的帖子,例如 CodeProject 网站或 www.asp.net 网站上的帖子,我不小心关闭了浏览器,或与互联网断开连接,或不小心导航到不同的网站。我准备的精心设计的消息丢失了,我不得不重新输入整个内容或不发布特定消息。因此,我采用的(许多其他人也采用的)解决方案是,我将消息单独输入到 Word 或记事本中,然后将消息文本复制并粘贴到消息发布页面中的相应表单字段。然后我将表单提交到网站。使用 Word 的优点是我可以离线保存消息,并且还可以获得所有好的功能,例如拼写和语法更正。本文中提供的代码为用户提供了一个自定义文档模板,他们可以使用该模板向上一篇文章中开发的“留言板”网站发布消息。用户可以直接从 Word 发布消息,他们不必将消息内容剪切并粘贴到网页中的表单字段。

Microsoft Word 2007 还包含一个用于博客文章的内置文档模板。博客文章文档模板可以发布到任何实现 meta-blog API 的站点。对于留言板,一个解决方案是我们实现 meta-blog API 并允许用户直接使用博客文章 Word 模板。我们将在后面的文章中这样做。在本文中,我想保持简单,并演示如何构建自定义文档模板。

在我们开始实际代码之前,让我们看看我们可以在 Visual Studio 2008 中开发的不同类型的 Microsoft Office Word 解决方案。

在 Visual Studio 2008 中开发 Microsoft Word 解决方案

Microsoft Office Word 是一个高度可定制的应用程序。VBA (Visual Basic for Applications) 长期以来一直可供 Office 开发人员使用。VBA 允许开发人员自动化 Microsoft Word 中的某些任务,例如格式化范围、自定义搜索和替换等。VBA 代码与 Microsoft Word 文档或模板一起保存。VBA 宏仅适用于特定文档或模板。对于应用程序级自定义,Word 支持加载项。Word 加载项可以基于 COM,因此可以使用 Visual C++、Visual Basic 6.0 甚至托管代码进行开发。

Visual Studio Tools for Office (VSTO) 提供了一种更简单、更好、更安全的方式来在托管代码中创建 Word 解决方案。VSTO 运行时屏蔽了大多数 COM 细节,并提供了一种更“.NET 式”的方式来开发 Word 解决方案。此外,VSTO 解决方案在单独的应用程序域中运行,因此它们在不同解决方案之间提供了很好的隔离度。VSTO 支持以下内容

  1. 应用程序级加载项 - 您可以使用 VSTO 开发 Word 加载项。这些加载项不与特定文档关联,可用于提供通用服务,例如文档共享和协作以及源代码控制。
  2. 文档级自定义 - VSTO 还可以用于自定义 Word 文档。VSTO 允许您开发 .NET 程序集并将其与 Word 文档关联。该 .NET 程序集可用于向 Word 文档添加自定义行为。
  3. 文档模板级自定义 - 如果要自定义一类文档(具有通用格式、行为或内容的文档),可以使用 VSTO 通过将托管程序集与模板关联来自定义 Word 文档模板。自定义将自动可用于从模板创建的所有文档。

现在我们已经了解了可以使用 VSTO 创建的不同解决方案,让我们为留言板应用程序选择正确的解决方案。

选择正确的解决方案

对于留言板应用程序,理论上我们可以使用 VSTO 支持的三种解决方案中的任何一种。我们可以构建一个加载项,允许将文档发布到留言板。但是,加载项的问题在于它将适用于所有文档。我们希望用于发布到留言板的文档格式大多是固定的:它有一个区域供用户键入主题,一个区域供用户键入消息文本。因此,开发应用程序级加载项没有多大意义。我们可以开发自定义 Word 文档或文档模板。自定义文档模板更有意义,原因如下

  1. 用户可以将不同的消息发布到留言板。文档的结构和格式将相同,但每条消息的内容将不同。强制执行结构和格式的最佳方法是使用模板。
  2. 用户通常会从一个带有占位符的空文档开始,然后键入消息。在文档中包含任何具体内容没有任何意义,这是支持使用文档模板的另一个论点。

既然我们已经决定使用文档模板,那么让我们动手编写一些代码,直接进入开发。

开始使用 Word 2007 模板

在本文中,我将使用 Word 2007。开发 Word 2003 模板的过程将略有不同。主要区别在于 Word 2003 不使用功能区。根据实际项目中的要求,您可能需要支持 Word 2003 和 Word 2007。如果您有兴趣学习如何为多个版本的 Word 进行开发,请留言。

首先,通过单击此链接下载本文第一部分的代码,并按照安装说明安装后端数据库。

接下来,解压缩 zip 文件并在 Visual Studio 中打开 MessageBoard.sln 文件。右键单击解决方案,然后单击“添加新项目”。从项目对话框中,选择

Office Project

这将导致 VSTO 向导出现

VSTO Wizard

键入 MessageBoard 作为文档名称(如图所示),然后单击“确定”。这将导致 Word 在 Visual Studio 窗口中打开,如下所示

Word in VS

您可以将工具箱中的控件拖放到 Word 文档中。接下来,我们将向 Word 文档添加控件。

向模板添加 Word 控件

您可以在 Word 文档中拖放并使用大多数 Windows Forms 控件。但是,在此项目中,我们将使用一种特殊类型的控件,称为“Word 控件

Word Controls

这些控件也称为内容控件。内容控件可用于在 Word 文档中开发类似表单的输入。内容控件可用于在 Word 文档中指定不同的区域以用于特定目的。例如,在留言板文档模板中,我们希望指定一个区域用于输入消息主题和消息文本。我们将使用的控件是PlainTextContentControl。顾名思义,PlainTextContentControl 只能包含纯文本,有点像 Windows Forms TextBox 控件。在我们的留言板网站中,我们尚不支持富文本内容(我们将在本系列的后续部分中添加),因此使用纯文本控件是有意义的。我们将拖放两个纯文本控件,一个用于主题,一个用于消息文本。就像 Windows Forms 控件一样,我们可以为每个内容控件提供一个名称。在我们的示例中,我们将它们命名为subjectmessageText。这些控件还有一些其他属性对我们很有用

属性名称 描述
文本 表示控件的文本。我们将在设计时将属性值设置为空。此属性将在运行时用于访问主题和消息文本。
PlaceHolderText 表示当控件没有文本时向用户显示的说明性文本。此文本以略微灰色的颜色显示

Plae holder

标题 标题显示在控件顶部,并提供有关控件功能的快速提示

Title

以下是为subject控件设置属性的方式

Subject properties

我们还将subject控件格式化为标题1

以下是messageText控件的属性外观

Message Text

现在我们已经在文档中指定了主题和文本区域,我们需要为最终用户提供一种方法,通过该方法他可以将内容控件中输入的文本发布到留言板。在 Office 2007 中,用户使用功能区调用命令。在下一节中,我们将向功能区添加控件,以便用户可以发布消息。

向功能区添加控件

在 Visual Studio 2008 之前,向功能区添加控件是通过手动编辑 XML 文件完成的。Visual Studio 2008 包含一个用于设计功能区控件的图形设计器。

另请注意,为文档模板项目向功能区添加控件仅适用于 Microsoft Word。它不适用于 Excel。这背后的原因是 Word 不是像 Excel 这样的 MDI 应用程序。Word 有多个顶级文档,每个文档都有自己的功能区。然而,Excel 对所有文档都有一个功能区。

要添加功能区,请右键单击项目并选择“添加项”。从项列表中选择“功能区”,如下所示

Ribbon Item

功能区在设计器中显示如下

Ribbon Components

功能区选项卡由功能区组组成,每个功能区组由功能区控件组成,如图所示。Microsoft Word 具有预定义的功能区选项卡,例如“主页”、“插入”、“页面布局”、“加载项”等。使用上述屏幕截图中的设计器创建的功能区将与预先存在的名为“加载项”的功能区选项卡中的现有控件合并。但是,在我们的留言板示例中,我们希望控件出现在“主页”选项卡中。为此,我们需要修改选项卡的属性。单击设计器中的功能区选项卡,并按如下所示修改属性

Ribbon Properties

我们将OfficeId属性更改为TabHome。这将使放置在选项卡内的所有控件和组与“主页”功能区选项卡合并。这里的问题是我们如何获取主页选项卡的OfficeId。Microsoft Office 网站上提供的 Excel 表格列出了所有 Office 应用程序的所有标准功能区控件的 ID。您可以使用 Excel 表格查找标准功能区选项卡、组和控件的 ID。您可以从以下链接下载所有 Office 应用程序的 Excel 表格

2007 Office System 文档:控制 ID 列表.

现在,如果您运行应用程序,功能区组将正确显示在“主页”选项卡中;但是,它将显示在最右侧。为了使其显示在左侧,我们必须按如下所示修改组的属性

Ribbon Group

这里需要注意的重要属性是PositionType属性。我们将其设置为BeforeOfficeId以指示该组应出现在标准 Office 组之前。我们将OfficeId属性设置为GroupClipboard以将其放置在剪贴板组之前。同样,剪贴板组的 ID 是使用上面提到的 Excel 表格获得的。

现在,功能区组已在正确的位置出现在正确的选项卡中。接下来,我们需要向组添加一个按钮。

您可以通过从工具箱中的“Office 2007 功能区控件”选项卡拖放Button控件来向功能区添加按钮

Office Ribbon

功能区中的按钮具有文本、ID 和图标图像。您可以为按钮指定自定义图标图像,或使用 Office 附带的一些标准图像。标准 Office 图像 ID 列表可在此处提供的 Excel 工作表中找到。

在留言板的例子中,我使用了默认博客模板用于发布消息的相同图标。图标 ID 是BlogPublish。最后,这是新添加按钮的属性

Button

现在我们有了一个按钮,我们可以添加代码来处理它的Click事件。双击按钮会自动生成一个处理程序。此处理程序位于 Ribbon.cs 文件中。我们添加代码如下

private void post_Click(object sender, RibbonControlEventArgs e)
{
  Globals.ThisDocument.PostMessage();
}

Globals.ThisDocument提供了与代码关联的 Word 文档对象的引用。VSTO 将所有程序集加载到单独的 AppDomain 中,并进行影子复制,因此即使单个 Microsoft Word 进程 (winword.exe) 中有模板的多个实例,Globals.ThisDocument仍将提供正确的文档引用。静态变量是每个 AppDomain 的。最后,我们添加一个名为PostMessage的方法,代码如下

internal void PostMessage()
{
    if (!ValidateSubjectAndText())
        return;

    //if (!AuthenticateUser())
    //    return;

    //InvokeWebService();
}

我们首先验证主题和文本,确保它们不为空。如果验证成功,我们调用一个名为AuthenticateUser的方法,该方法验证用户,最后,我们使用InvokeWebService方法调用发布消息的 Web 服务。我们将在稍后详细介绍AuthenticateUserInvokeWebService。以下是ValidateSubjectAndText方法的外观

private bool ValidateSubjectAndText()
{

    //Validate the subject
    if (String.IsNullOrEmpty(subject.Text))
    {
        MessageBox.Show(Resources.SpecifySubject, Resources.ApplicationName);
        return false;
    }

    //Validate the text
    if (String.IsNullOrEmpty(messageText.Text))
    {
        MessageBox.Show(Resources.SpecifySubject, Resources.ApplicationName);
        return false;
    }

    return true;
}

我们尚未添加将消息发布到留言板的实际代码。在此之前,我们需要将留言板 API 公开为 Web 服务。然后,文档模板可以使用此 Web 服务来发布消息。现在,让我们转到服务器端。

创建留言板 Web 服务

我们需要添加一个 Web 服务,文档模板项目可以使用该服务将消息添加到留言板。要向留言板添加消息,我们使用MessageSource对象的AddMessage方法

public static void AddMessage(string subject, string text)

该方法的详细信息在系列文章的上一篇文章中。我们必须公开一个 Web 服务,该服务反过来使用此方法将消息添加到留言板。第一个问题是我们应该创建哪种 Web 服务?我们有两个选项:ASP.NET (asmx) Web 服务或 WCF Web 服务。在下一节中,我们将决定使用哪一个。

WCF 还是 ASMX?

在 WCF 之前,ASP.NET Web 服务 (asmx) 是 .NET 中构建 Web 服务的常用方法。ASP.NET Web 服务不像 WCF 那样丰富。例如,WCF 支持大多数 WS 规范。WCF 的优点在于,您只需更改配置文件即可获得丰富的 Web 服务功能。尽管我们将在本文中不使用很多 WCF 功能,但将留言板公开为 WCF 服务仍然有意义,因为将来可以轻松地拥有丰富的 Web 服务支持。在下一节中,我们将创建 WCF 服务。

创建 WCF 服务

按照上一篇文章的约定,我们将把 WCF 服务的实际代码添加到 MessageBoard.Web 项目中,并将公开 Web 服务的 svc 文件添加到 MessageBoard 网站。创建 Web 服务的最简单方法是使用“添加新项”对话框

Add WCF Service

这将自动创建服务契约 - IMessageBoardService 和实现此契约的类 - MessageBoardService。我们修改向导生成的接口 IMessageBoardService,如下所示

[ServiceContract]
public interface IMessageBoardService
{
    [OperationContract]
    void AddMessage(string subject, string text);
}

接下来,我们需要修改MessageBoardService类以实现此接口,如下所示

[AspNetCompatibilityRequirements(RequirementsMode
     =AspNetCompatibilityRequirementsMode.Allowed)] 
public class MessageBoardService : IMessageBoardService
{
    public void AddMessage(string subject, string text)
    {
        MessageSource.AddMessage(subject, text);
    }
}

请注意,AspNetCompatibilityRequirements 设置为 AspNetCompatibilityRequirementsMode.Allowed。此属性与配置文件中的以下配置设置协同工作

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

这些属性结合在一起,确保当从服务代码内部调用时,HttpContext.Current 属性返回一个有效对象。有关此内容的更多信息,请参阅此博客文章。我们为什么需要 ASP.NET 兼容性?AddMessage 调用 Membership.GetUser 方法。GetUser 方法在内部使用 HttpContext.Current 查找用户。它还与我们如何验证用户有关;我们将使用 .NET 客户端应用程序服务而不是内置的 WCF 身份验证。

下一步是添加一个 svc 文件,该文件将用于访问 WCF 服务。我们在 MessageBoard 网站中创建一个名为 MessageBoard.svc 的文件

<%@ ServiceHost Service="MessageBoard.Web.MessageBoardService"  %>

最简单的方法是向网站添加一个文本文件并将扩展名重命名为 svc。我们尚未完全完成 Web 服务。我们需要将配置设置添加到 web.config 文件中。

配置服务

WCF 服务在使用前需要进行配置。您可以使用 WCF 服务配置编辑器,也可以手动编辑 web.config 文件。无论哪种方式,您都需要将以下设置添加到配置文件中

 <system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  <behaviors>
   <serviceBehaviors>
    <behavior name="MessageBoardServiceBehavior">
     <serviceMetadata httpGetEnabled="true" />
     <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
   </serviceBehaviors>
  </behaviors>
  <services>
   <service behaviorConfiguration="MessageBoardServiceBehavior"
    name="MessageBoard.Web.MessageBoardService">
    <endpoint binding="basicHttpBinding"
     bindingConfiguration="" 
    contract="MessageBoard.Web.IMessageBoardService" />
   </service>
  </services>
 </system.serviceModel>

注意:system.servicemodel 部分可能已经存在于配置文件中。在这种情况下,您需要将上述配置设置与 web.config 文件中已有的内容合并。

我们使用BasicHttpBinding公开服务,为了简单起见,我们不使用更安全的WsHttpBinding。但是请记住,我们始终可以通过更改配置设置来选择使用其他绑定。现在,我们已经正确配置了Web服务。您可以通过在浏览器中查看MessageBoard.svc文件来测试它。

现在,让我们回到文档模板项目,看看如何调用 Web 服务。

链接服务器和客户端

为了从客户端项目调用 Web 服务,我们需要添加对 Web 服务的引用。这可以通过右键单击 MessageBoard.Word 项目并选择“添加服务引用”来完成。在弹出的“添加服务引用”对话框中,单击左下角的“高级”按钮。在弹出的对话框中,单击“添加 Web 引用”按钮。这将弹出“添加 Web 引用”对话框。在结果对话框中,单击当前解决方案中的 Web 服务并选择 MessageBoardService。选择 MessageBoardService 后,将自动为您创建用于调用服务的代理类。

为什么添加 Web 引用如此复杂?

在 Visual Studio 2005 中只需一个步骤即可完成的操作,现在在 Visual Studio 2008 中需要三个步骤。这背后的原因是 Visual Studio 2008 希望您将 WCF 用于 Web 服务客户端代码。我们不能使用 WCF 客户端代码,因为它不像旧的 Web 服务代理类那样对 Web 请求提供那么多控制。在本文中,我们需要在调用 Web 服务时对指定 cookie 进行一些控制。如果我们使用基于 WCF 的客户端代码,这是不可能的,因此我们必须使用旧的 Web 服务代理。

现在,我们准备好调用 Web 服务了。

调用 Web 服务

我们在 ThisDocument.cs 文件中添加了一个名为 InvokeWebservice 的占位符方法来调用 Web 服务。现在可以按如下方式编码

private void InvokeWebService()
{
    using (MessageBoardService service = new MessageBoardService())
    {
       try
       {
           service.AddMessage(subject.Text, messageText.Text);
           MessageBox.Show(Resources.MessagePosted, 
               Resources.ApplicationName);
       }
       catch (WebException ex)
       {
          MessageBox.Show(ex.Message, Resources.ApplicationName);
       }
       catch (SoapException ex)
       {
          MessageBox.Show(ex.Message, 
             Resources.ApplicationName);
       }
    }
}

取消注释PostMessage方法中的InvokeWebService调用

internal void PostMessage()
{
    if (!ValidateSubjectAndText())
        return;

    //if (!AuthenticateUser())
    //    return;

    InvokeWebService();
}

要测试启动 MessageBoard.Web 项目,输入一些主题和文本,然后单击功能区中的“发布消息”按钮。如果消息发布成功,您将收到一个消息框,指示消息已成功发布。您还可以在浏览器中查看留言板网站,以确保消息出现。如果一切正常,您会注意到新消息是匿名发布的。这是因为我们尚未对用户进行身份验证。在下一节中,我们将使用 ASP.NET 客户端应用程序服务对用户进行身份验证。

使用 ASP.NET 客户端服务验证用户

如果您一直在使用 WCF,您可能会想知道为什么我们不在本文中使用 WCF 身份验证。WCF 安全非常强大,它还集成了 ASP.NET 成员资格。但是,WCF 身份验证需要额外的配置工作。例如,如果您想在 WCF 中使用用户名/密码身份验证,您需要配置证书(或测试证书)才能使身份验证起作用。尽管许多项目可能需要如此高的安全性,但我决定保持简单,并使用轻量级替代方案:ASP.NET 客户端应用程序服务。

什么是 ASP.NET 客户端应用程序服务?简单地说,ASP.NET 客户端应用程序服务允许您从任何 .NET 应用程序远程访问 ASP.NET Web 服务器上的成员资格、配置文件和角色服务。因此,如果您有一个配置了 ASP.NET 成员资格的 Web 服务器,您可以使用该 Web 服务器在桌面 Windows 应用程序上验证用户。这是一种极其轻量级的身份验证 API。如果您还记得,MessageBoard 站点配置了 ASP.NET 成员资格,并且用户使用 ASP.NET 成员资格进行身份验证。现在,我们需要对从 Microsoft Word 发布的消息执行相同的操作。

要使用 ASP.NET 成员资格实现身份验证,首先,我们需要配置服务器。将以下设置添加到 web.config 文件中

<system.web.extensions>
  <scripting>
    <webServices>
        <authenticationService enabled="true"/>
    </webServices>
  </scripting>
</system.web.extensions>

接下来,我们需要修改 MessageBoard.Web 项目的项目属性

Client Services

在“身份验证服务位置”下,输入 MessageBoard 网站的 URL。另请注意“凭据提供程序”字段设置为MessageBoard.Word.LogOnForm。这是一个非常简单的使用 Windows 窗体开发的登录窗体,它实现了接口IClientFormsAuthenticationCredentialsProvider。该窗体的代码如下所示

public partial class LogOnForm : Form, 
    IClientFormsAuthenticationCredentialsProvider
{
    public LogOnForm()
    {
        InitializeComponent();
    }

 
    public ClientFormsAuthenticationCredentials GetCredentials()
    {
        return (this.ShowDialog() == DialogResult.OK) ?
            new ClientFormsAuthenticationCredentials(
                    userName.Text, 
                    password.Text, 
                    rememberMe.Checked)
            : null;

    }

}

以下是表单在设计器中的样子

Log on form

当您使用客户端应用程序服务验证用户时,如果提供给身份验证 API 的用户名为空或没有保存的凭据,此对话框将自动显示。当指示(选中“记住我”)时,客户端应用程序服务会自动将用户凭据保存在离线 SQL Server Everywhere 数据库中。默认情况下,数据库会自动在用户的数据目录中创建。如果您不打算保存用户身份验证数据,可以通过单击项目属性中“服务”页面上的“高级”按钮来完成。现在,让我们看看验证用户所涉及的步骤。正确设置项目属性后,验证用户就像调用Membership.ValidateUser方法一样简单

private bool AuthenticateUser()
{
    //Authenticate the user
    if (!Membership.ValidateUser(String.Empty, 
            String.Empty))
    {
        if (MessageBox.Show(
             Resources.InvalidUserNamePassword, 
             Resources.ApplicationName, 
             MessageBoxButtons.YesNo)
              != DialogResult.Yes)
            return false;
    }

    return true;
}

AuthenticateUser使用空用户名和密码调用Membership.ValidateUser。这将导致LogOnForm自动显示,供用户提供凭据。如果身份验证不成功,ValidateUser方法返回null;在这种情况下,我们询问用户是否要匿名发布消息。如果是,我们返回true;否则(或如果用户已通过身份验证),我们返回false

我们尚未完成。我们需要确保 Web 服务是使用ValidateUser方法完成的身份验证来调用的。InvokeWebService方法的代码略有更改

using (MessageBoardService service = new MessageBoardService())
{
    ClientFormsIdentity identity = 
      Thread.CurrentPrincipal.Identity as ClientFormsIdentity;

    //Make sure that the authentication cookies go with the web request 
    if (identity != null)
        service.CookieContainer = identity.AuthenticationCookies;

    try
    {
        service.AddMessage(subject.Text, messageText.Text);
        MessageBox.Show(Resources.MessagePosted, 
           Resources.ApplicationName);
    }
    catch (WebException ex)
    {
        MessageBox.Show(ex.Message, 
          Resources.ApplicationName);
    }
    catch (SoapException ex)
    {
        MessageBox.Show(ex.Message, 
          Resources.ApplicationName);
    }
    
}

如果身份验证成功,则线程的主体被设置为具有ClientFormsIdentity类型身份的主体。如果身份验证成功,服务器将返回包含 ASP.NET Forms 身份验证票证的 cookie。在后续调用中,客户端可以只发送 cookie 以向服务器指示身份验证数据。cookie 在ClientFormsIdentity对象的CookieContainer属性中可用。我们将 Web 服务代理的CookieContainer属性设置为相同的 cookie 容器,以便 Web 服务使用正确的身份验证 cookie 进行调用。因此,现在 Web 服务调用在服务器端进行了身份验证。您可以通过发布另一条消息并验证新发布消息中的用户名是否正确设置来测试它。

本文系列的第二部分到此结束。在下一部分中,我们将回到网站并添加一些 AJAX 支持。

请随意对文章发表评论,特别是如果您认为文章有不足之处。这将有助于我改进未来的文章。

系列导航

历史

  • 2007 年 12 月 28 日 - 初次发布。
  • 2007 年 12 月 31 日 - 添加了系列导航和安装说明。
  • 2007 年 12 月 31 日 - 解决了上传文件的问题
© . All rights reserved.