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

集成 WCF 服务

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (11投票s)

2008年4月25日

CPOL

3分钟阅读

viewsIcon

45776

downloadIcon

500

本文介绍如何动态加载 WCF 服务(无需事先了解服务的协定),设置其参数并按顺序调用它们。

引言

本文试图呈现的基本概念是如何动态订阅 WCF 服务,而无需事先了解服务的协定定义。加载这些服务后,用户可以选择要从这些服务中调用的所需操作,并通过一个简单的序列器按顺序调用它们。 用户还可以为特定操作的任何参数设置值。 通过这种概念,可以集成独立位于不同位置的服务,从而形成更大规模的解决方案。

请注意,本文仅试图说明使用 WCF 服务的基本可能性。 文章中省略了许多更高级的可能性,并在下面的 Todo 部分中提出了建议。

致谢

该示例项目引用了以下优秀作品

Vipul Modi 的 WCF 动态编程

Luyan 的通用快速方法调用器

Using the Code

这个概念非常简单。 有服务托管在某个地方,准备被订阅。 这些只是普通的 WCF 服务。 客户端应用程序可以通过要求用户输入所需服务的 URL 来加载这些服务。 对于示例项目,名为 ExampleService 的服务托管在以下 URL 上

public class ExampleService : IWorkWithIntrinsic
{
    #region IWorkWithIntrinsic Members

    public void WorkWithIntegers(int first, int second)
    {
        Console.WriteLine("IWorkWithIntrinsic.WorkWithIntegers was called.");
        Console.WriteLine("\t1st Integer: " + first);
        Console.WriteLine("\t2nd Integer: " + second);
    }

    public string WorkWithString(string myString)
    {
        Console.WriteLine("IWorkWithIntrinsic.WorkWithString was called.");
        Console.WriteLine("\tString: " + myString);
        return myString + " returned from server.";
    }

    public double WorkWithDouble(double myDouble)
    {
        Console.WriteLine("IWorkWithIntrinsic.WorkWithDouble was called.");
        Console.WriteLine("\tDouble: " + myDouble);
        return myDouble + 1.0;
    }

    #endregion
}

用户可以通过转到“文件”,然后“加载服务”来加载(订阅)服务。 将出现以下对话框。 用户应选中“加载所有协定”复选框,然后单击“确定”。

loadservice.JPG

所有已加载的服务(代理)将显示在树视图中。 然后,用户可以通过右键单击操作节点并选择“添加操作”来选择要添加到序列器的所需操作。 如下图所示

addoperations.JPG

最后,用户可以单击“播放”按钮以执行所有选定的操作。

integrator.JPG

以下屏幕截图描述了服务器端发生的事件序列。

server.JPG

解决方案中每个项目的简要说明

  • Integrator.Framework.DynamicProxyModel – 使动态代理创建成为可能的项目。 几乎所有内容都来自 Vipul Modi 的上述优秀作品。
  • Integrator.Framework.ServiceManagerModel – 用于管理所有加载的代理及其操作和参数的项目。
  • Integrator.Framework.Sequencer – 包含序列器组件。
  • Integrator.Framework.TestServer – 服务宿主应用程序
  • Integrator.UI.Shell – 承载所有 UI 组件的 CAB Shell。
  • Integrator.UI.Sequencer – 承载序列器的 UI。
  • Integrator.UI.LoadedServices – 承载所有加载的代理的 UI。
  • Integrator.UI.ParameterEditor – 承载参数编辑器的 UI。
  • Integrator.UI.Common – 包含所有 UI 组件的常量和事件参数。

运行示例项目

Integrator.Framework.TestServer 设置为活动项目,然后从 Visual Studio 2005 中按 Alt-F5 执行它。

Integrator.UI.Shell 设置为活动项目,然后从 Visual Studio 2005 中按 F5 执行该项目。 按照上面“基本概念描述”部分中描述的步骤执行。

待办事项

以下项目是项目的计划功能,但我找不到时间来实现。

事件代理系统 – 与序列器一起工作,以构建发布/订阅模型。 想法是,一旦完成一个操作,其返回参数可以用作另一个操作的输入参数。

处理复杂参数 - 目前,已经包含了处理复杂参数的代码,但只是半成品。

提供 UI - 让服务提供自己的 UI(可能是 XAML)。

历史

  • 2008 年 4 月 25 日:首次发布
© . All rights reserved.