使用 Castle Windsor WcfFacility 创建客户端端点

2023-11-21

我创建了三个程序集。一个网站、一个 WCF 服务和一个包含服务实现的接口的契约程序集。我想使用 Castle Windsor 在客户端(网站)上为我创建服务,这样我就不必在网站的 web.config 中为我希望使用的每个服务提供端点。

我想查看合约程序集并获取命名空间中的所有服务接口。现在,对于每项服务,在向容器注册组件时,我都有类似以下内容的内容。

container.Register(Component.For<ChannelFactory<IMyService>>().DependsOn(new { endpointConfigurationName = "MyServiceEndpoint" }).LifeStyle.Singleton);
container.Register(Component.For<IMyService>().UsingFactoryMethod((kernel, creationContext) => kernel.Resolve<ChannelFactory<IMyService>>().CreateChannel()).LifeStyle.PerWebRequest);

在我的 web.config 中我有设置代码。

  <system.serviceModel>
      <extensions>
         <behaviorExtensions>
            <add name="AuthToken" type="MyNamespace.Infrastructure.AuthTokenBehavior, MyNamespace.Contracts" />
         </behaviorExtensions>
      </extensions>
      <behaviors>
         <endpointBehaviors>
            <behavior>
               <AuthToken />
            </behavior>
         </endpointBehaviors>
      </behaviors>

      <bindings>
         <wsHttpBinding>
            <binding maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00">
               <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647"></readerQuotas>
               <security mode="None" />
            </binding>
         </wsHttpBinding>
      </bindings>

      <client>
         <endpoint name="MyServiceEndpoint" address="http://someurl/MyService.svc" binding="wsHttpBinding" contract="MyNamespace.Contracts.IMyService"></endpoint>
      </client>
   </system.serviceModel>

我最终得到了多个服务端点,它们看起来几乎完全相同,当我们部署到客户端计算机上时,他们必须设置每个端点的地址,即使每个端点的基本 URL 都是相同的。

我希望在 web.config 中有一个通过代码获取的基本 url,然后使用合约程序集上的反射将服务注册到容器中。我确实需要上述配置文件中的专门端点行为。

那么我从哪里开始呢? WcfFacility 看起来很棒,但 doco 有点缺乏......


我同意 wcf 工具的文档缺乏,这很令人难过,因为它是一个非常出色的工具,如果人们因为无法开始使用而没有使用它,那将是一个真正的耻辱,所以让我看看我是否可以提供帮助如果可以的话,你出去一下……

让我们创建一个包含三个项目的应用程序:

  1. 共享合约的类库
  2. 充当服务器的控制台应用程序
  3. 充当客户端的控制台应用程序

我们的想法是,我们希望在注册服务时能够使用服务名称并共享基本 URL(我认为这就是您所要求的,如果没有,希望您可以从这里推断)。因此,首先,共享合约中只包含以下内容(没什么特别的,正常的 WCF 费用):

[ServiceContract]
public interface IMyService1
{
    [OperationContract]
    void DoSomething();
}

[ServiceContract]
public interface IMyService2
{
    [OperationContract]
    void DoSomethingToo();
}

现在服务器控制台应用程序看起来像这样,我们首先实现服务契约(同样没有什么特别的,只是实现接口的类),然后将它们全部注册为服务(注意这里不需要任何配置文件,您可以更改您的方式)使用温莎为您提供的所有选项来决定什么是服务等 - 我的方案有点有限,但它给了您一个想法):

namespace Services
{
    public class MyService1 : IMyService1
    {
        public void DoSomething()
        {
        }
    }

    public class MyService2 : IMyService2
    {
        public void DoSomethingToo()
        {
        }
    }
}

//... In some other namespace...

class Program
{
    // Console application main
    static void Main()
    {
        // Construct the container, add the facility and then register all
        // the types in the same namespace as the MyService1 implementation
        // as WCF services using the name as the URL (so for example 
        // MyService1 would be http://localhost/MyServices/MyService1) and
        // with the default interface as teh service contract
        var container = new WindsorContainer();            
        container.AddFacility<WcfFacility>(
            f => f.CloseTimeout = TimeSpan.Zero);
        container
            .Register(
                AllTypes
                    .FromThisAssembly()
                    .InSameNamespaceAs<MyService1>()
                    .WithServiceDefaultInterfaces()
                    .Configure(c =>
                               c.Named(c.Implementation.Name)
                                   .AsWcfService(
                                       new DefaultServiceModel()
                                           .AddEndpoints(WcfEndpoint
                                                             .BoundTo(new WSHttpBinding())
                                                             .At(string.Format(
                                                                 "http://localhost/MyServices/{0}",
                                                                 c.Implementation.Name)
                                                             )))));

        // Now just wait for a Q before shutting down
        while (Console.ReadKey().Key != ConsoleKey.Q)
        {
        }
    }
}

那就是服务器,现在如何消费这些服务呢?嗯,实际上这很简单,这是一个客户端控制台应用程序(它仅引用合约类库):

class Program
{
    static void Main()
    {
        // Create the container, add the facilty and then use all the
        // interfaces in the same namespace as IMyService1 in the assembly 
        // that contains the aforementioned namesapce as WCF client proxies
        IWindsorContainer container = new WindsorContainer();

        container.AddFacility<WcfFacility>(
            f => f.CloseTimeout = TimeSpan.Zero);

        container
            .Register(
                Types
                    .FromAssemblyContaining<IMyService1>()
                    .InSameNamespaceAs<IMyService1>()
                    .Configure(
                        c => c.Named(c.Implementation.Name)
                                 .AsWcfClient(new DefaultClientModel
                                                  {
                                                      Endpoint = WcfEndpoint
                                                          .BoundTo(new WSHttpBinding())
                                                          .At(string.Format(
                                                              "http://localhost/MyServices/{0}",
                                                              c.Name.Substring(1)))
                                                  })));

        // Now we just resolve them from the container and call an operation
        // to test it - of course, now they are in the container you can get
        // hold of them just like any other Castle registered component
        var service1 = container.Resolve<IMyService1>();
        service1.DoSomething();

        var service2 = container.Resolve<IMyService2>();
        service2.DoSomethingToo();
    }
}

就是这样 - 希望这能让你开始(我发现实验和使用智能感知通常能让我到达我需要去的地方)。我向您展示了服务端和客户端,但如果您愿意,可以只使用其中之一。

您应该能够看到绑定的配置位置以及我如何构建 URL,因此在您的情况下,您可以轻松地从配置文件或任何您想要执行的操作中提取基本 URL。

最后要提到的是,您可以通过将自定义端点行为添加为端点的扩展来添加自定义端点行为,因此在客户端示例中,您将具有如下所示的内容:

Endpoint = WcfEndpoint
    .BoundTo(new WSHttpBinding())
    .At(string.Format("http://localhost/MyServices/{0}", c.Name.Substring(1)))
    .AddExtensions(new AuthTokenBehavior())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Castle Windsor WcfFacility 创建客户端端点 的相关文章

  • 使用 ELMAH 记录 WCF 服务的异常

    我们正在使用优秀的ELMAH http code google com p elmah处理 ASP NET 3 5 Web 应用程序中未处理的异常 这对于除使用 REST 功能使用的 WCF 服务之外的所有站点都非常有效 当操作方法中发生应
  • 创建WCF数据服务以在服务主机中使用

    我有一个服务应用程序 它通过不同的绑定托管多个 WCF 端点 我现在想在同一服务主机中托管 WCF 数据服务 这个帖子 https stackoverflow com questions 2926767 wcf data service h
  • WCF 缓慢的 ServiceHost.Open() 调用

    这是一个与此类似的问题 WCF 服务的 Win32Exception ServiceHost Open https stackoverflow com questions 1542242 win32exception servicehost
  • WCF服务通过IIS与第三方dll连接

    我正在使用 Windows 7 VS2010 SqlServer 2008 我的应用程序从第三方 dll 获取数据 它从必须在后台运行的另一个进程获取数据 并处理数据 然后通过 WCF 服务将其发送到前端 应用程序已完成并执行其应该执行的操
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • WCF服务健康状况监控

    我刚刚实现了 WCF 服务 目前正在研究服务监控选项 我们的服务器团队目前仅托管 java 服务 希望我们的实例始终运行 因此它可以在该实例的生命周期内收集数据 他们表示将使用我们的 webmon 操作之一来获取统计信息 但我们正在使用每次
  • SvcUtil.exe 与添加引用

    当 VS NET 中的 添加服务引用 提供了您需要的所有代理类时 为什么有人会使用 SvcUtil exe 有时在 VS 中添加服务引用无法创建有用的代理 相反 它为您提供了一个空的 Reference cs 详细信息here https
  • 从 WCF REST 获取错误详细信息

    我有一个由 Net WCF 客户端使用的 REST 服务 遇到错误时 REST 服务会返回 HTTP 400 错误请求 响应正文包含 JSON 序列化详细信息 如果我使用 Fiddler Javascript 或直接从 C 执行请求 我可以
  • WCF 缓存解决方案 - 需要建议

    我工作的公司正在寻求实施缓存解决方案 我们托管了多个 WCF Web 服务 并且需要缓存某些可以持久保存和获取的值 无论客户端与服务的会话如何 我正在研究以下技术 缓存应用程序块 4 1 使用 HttpRuntime 缓存的 WCF TCP
  • 使用 SOAP 调用 WCF 服务

    我正在尝试在不创建 WCF 客户端的情况下测试 WCF 服务 我有类似的代码 问题here https stackoverflow com a 1643025 1397017 我希望完全控制 SOAP 负载 因此我希望能够发出我自己的 We
  • 为 Rest Web 服务创建 WCF 代理

    我有一个复杂的 WCF Rest 服务 它需要多个输入和对象 我不能简单地通过在 Fiddler 中执行 HTTP POST 来调用它 因为要提供的数据太多 我可以 但这将花费我很长时间 所以我想使用代理在代码中完成它 有没有办法为 NET
  • 多个 WCF 服务实现相同的服务契约接口

    多个wcf服务是否可以实现同一个服务契约接口 我想要做的是允许测试服务与真实服务互换 并指定在配置文件中使用哪个服务 例如 ServiceContract public interface IUselessService Operation
  • WCF Rest Web 服务在本地主机上工作,但不在主机上工作

    我在 ASP net 网站内创建了一个简单的 WCF Web 服务 该网络服务由IIS并且在本地主机上工作正常 即访问时http localhost myservice svc HelloWorld http localhost myser
  • WCF 客户端返回空数组 - XML 响应似乎正常

    我正在尝试为我们的 Intranet 上托管的 Web 服务创建一个简单的 WCF 客户端 C 使用 Fiddler 和 SoapUI 我可以看到请求和响应似乎正常 但是当我运行代码时返回一个空数组 我会尝试只粘贴相关的行 但会是很多东西
  • 将 .NET 类库(主要定义 CRUD 操作)公开为服务

    公开现有内容的最佳 有效和最快的方法是什么 类 图书馆 主要定义 CRUD 操作 作为service 周转基金服务 or WCF数据服务 以便它可以与银光 or Ajax 在那儿tools 代码生成器 RAD 工具 哪些可以支持这个 预先感
  • WCF - 在服务中抛出故障异常的开销

    我发布了一个question https stackoverflow com questions 81306 wcf faults exceptions versus messages关于使用消息与故障异常在服务之间传达业务规则 我的印象是
  • 从 OperationContext 获取 SOAP 标头中的值

    我有以下代码C 寻找一个apiKey在下面的SOAP header SOAP 标头
  • 从 WCF 服务返回接口

    我有一些 NET 远程处理代码 其中在某些服务器端类中实现的工厂方法返回具体对象的接口 也在同一台服务器上执行 NET 远程处理会自动创建代理 并允许我将接口传递给客户端 然后客户端可以直接调用它们 接口示例 public interfac
  • 异步调用的任务限制?

    我有一个同步工作的 NET 4 5 WCF 客户端 我正在更新它以使用新的异步 等待功能来进行多个同时服务器调用以同时获取数据块 在结束之前 我担心同时运行的所有线程将使服务器饱和 更不用说明年升级到该角色时会终止我的 Azure 辅助角色
  • 有状态 WCF Web 服务

    我是 WCF 新手 我一直在尝试在 Web 服务中使用会话状态 我设法使用number http www codeproject com KB session SessionWithWS aspx msg 3227646 of http w

随机推荐

  • HTML5 结构 -

    再会 我刚刚开始学习 HTML5 没有任何问题 一切都很顺利 我只有一个关于语义使用的小问题
  • swagger 结合一些重复的注释

    I use useDefaultResponseMessages false 并在每个方法中 ApiResponses value ApiResponse code 200 message Success response Order cl
  • 在字段名称周围使用反引号

    在阅读了一些关于一些 SQL 问题的答案和评论之后 还听说我的一个朋友在一个有禁止它们的政策的地方工作 我想知道在 MySQL 中的字段名称周围使用反引号是否有什么问题 That is SELECT id name anotherfield
  • 使用 awk 打印除匹配范围模式之外的所有内容

    在 Awk 中 范围模式不是表达式 因此不能使用 不是它 那么如何实现它 使用 awk 打印除匹配范围模式之外的所有内容 e g cat 1 t abd hfdh fafa deafa 123 end 我想要的结果 cat 1 t abd
  • 实时生产中 Django 与 argon2 哈希器的问题

    所以我刚刚设置了我的 Digital Ocean Droplet 服务器 并一直在努力让这个网站正常工作 但是我遇到了一个又一个错误 我终于找到了加载登录页面的网站 这是应该发生的事情 但是当我登录时 我收到一个错误 Argon2 Pass
  • 导出奇怪的重复模板和协方差

    假设我有一个基类 它克隆派生类 class Base public virtual Base clone return new Base 我有一组派生类 它们是使用奇怪的重复模板模式实现的 template
  • 数组中每个元素右侧存在的最大元素

    我得到了一个 n 个元素 数组 我必须找到每个元素右侧大于其自身 当前元素 的最小元素 For example Array 8 20 9 6 15 31 Output Array 9 31 15 15 31 1 是否可以解决这个问题O n
  • C# 并发 - 长时间运行任务的首选方法

    当需要在整个应用程序生命周期中运行 I O 侦听器时 在 4 5 框架上运行的 C 5 0 首选哪种并发模型 我已经确定生产者 消费者模式最适合处理我收到的内容 但是什么基础设施应该支持它 会一个简单的Thread thread new T
  • 如何在 Google 地图中显示我当前的位置?

    我想在谷歌地图中显示我当前的位置 它应该是动态的 即经度和纬度应该动态设置 就像现在我在新德里一样 如果我启动我的 Android 应用程序 我当前的位置应该显示在新德里 如果我前往其他城市 它应该会改变 获取当前位置在 Android 上
  • Github Action 在多个 on:push: 路径上触发

    在单个存储库中 我想为不同的路径创建多个触发器 paths frontend and paths backend 对于 相同的 构建作业使用不同的参数 以下是两个工作流程 name Trigger Jenkins Build Build P
  • 如何使用导航组件在单个片段上正确添加选项菜单而不破坏“向上行为”

    我在单个片段上添加选项菜单时遇到一些麻烦 因为它破坏了导航 这是我的代码 我有一个活动NoActionBar风格和布局
  • UTF-8 和 JavaScript

    我使用 Javascript 获取使用字符集 UTF8 定义的 HTML 页面中的数据 我的 javascript 方法使用字符集 UTF8 加载 但是当我使用 innerHTML 获取数据时 我遇到了编码问题 例如 工资 我错过了什么吗
  • 哪个更好:

    哪个更好或更方便使用 or 您是否需要 type 属性 如果您使用的是 HTML5 则不需要 否则 是的 HTML 4 01 和 XHTML 1 0 指定type属性为必填项 而 HTML5 将其作为可选属性 默认为text javascr
  • 钻石上的像素坐标

    我得到了一张图像 其中有几颗钻石并排放置 如下图所示 我知道图像上的唯一坐标是顶角 绿色文本 当我点击图像时 我得到了该点的坐标 但我无法得到我所在的钻石 例如我点击红点 我怎么知道x 260 y 179 顶部菱形 蓝色属于左边 ETC 非
  • 静态链接 libstdc++:有什么问题吗?

    我需要将使用 GCC 4 7 的 libstdc 在 Ubuntu 12 10 上构建的 C 应用程序部署到运行 Ubuntu 10 04 的系统 该系统附带了相当旧版本的 libstdc 目前 我正在编译 static libstdc s
  • f# 重复定义

    在 F powerpack 数学提供程序源代码中 我看到了这个 在lapack service netlib fs member this dgemm a matrix b matrix allocate results let c Mat
  • 如何通过 ant 构建脚本编译 .drl 文件

    我是流口水的新手 我想知道是否可以使用某种可以在 Windows 命令行 shell cmd 中输入的命令来编译 drl 文件 我查看了 drools 发行版附带的二进制文件 但我无法找到编译 drl 文件的方法 我对这样的命令感兴趣的原因
  • C# NUnit 的 BDD

    我一直在使用自制的 BDD Spec 扩展在 NUnit 中编写 BDD 样式测试 我想看看每个人的想法 它能增加价值吗 很烂吗 如果是这样为什么 那里有更好的东西吗 这是来源 https github com mjezzi NSpec 我
  • 如何在 Github Flavored Markdown 上的 URL 中使用尖括号?

    我想在 Github Flavor Markdown 的 URL 中使用尖括号 降价 1 Fork it http github com
  • 使用 Castle Windsor WcfFacility 创建客户端端点

    我创建了三个程序集 一个网站 一个 WCF 服务和一个包含服务实现的接口的契约程序集 我想使用 Castle Windsor 在客户端 网站 上为我创建服务 这样我就不必在网站的 web config 中为我希望使用的每个服务提供端点 我想