单个 WCF 服务中的多个基地址

2023-11-23

我有一个环境,同一服务器上托管的多个站点将使用单个服务进行调用。例如:

http://domain1.com/Api/Service.svc

http://domain2.com/Api/Service.svc

Api 应用程序已在每个站点中设置为虚拟目录,映射到同一物理目录,以便源仅位于一个地方。问题是 WCF 不喜欢为其服务端点拥有多个基地址。为了让服务正常工作,我必须添加一个基本地址前缀过滤器:

<serviceHostingEnvironment>      
  <baseAddressPrefixFilters>        
    <add prefix="http://domain1.com/Api" />
    <!--<add prefix="http://domain2.com/Api" />-->
  </baseAddressPrefixFilters>
</serviceHostingEnvironment>

然而,这只适用于domain1,因为你只允许使用一个baseAddressPrefixFilter(他们不应该称它为baseAddressPrefixFilters如果你只被允许一个)。我尝试构建一个自定义 ServiceHostFactory 来解决这个问题,但在激活过程中调用 ServiceHostFactory 之前我遇到了过滤器问题。

关于如何让单个服务在两个域上工作有什么想法吗?


好的,将整个 URL 放入端点地址是我没有想到的,所以这让我有所收获。使用自定义 ServiceHostFactory 后,它适用于domain1,但不适用于domain2。我收到了一条以前从未见过的新错误消息:

“没有协议绑定与给定地址匹配'http://domain2.com/Api/Poll.svc/soap'。协议绑定在 IIS 或 WAS 配置中的站点级别进行配置。”

Update:

好吧,我想通了(终于!)。我可以将主机节点添加到服务定义中,并避免在每个端点中使用绝对 URL。我还删除了 BaseAddressPrefixFilter,但在解决方案中保留了自定义 ServiceHostFactory。

  <service name="Poll">
    <host>
      <baseAddresses>
        <add baseAddress="http://domain1.com/Api"/>
        <add baseAddress="http://domain2.com/Api"/>
      </baseAddresses>
    </host>
    <endpoint address="soap" binding="basicHttpBinding" bindingConfiguration="soapBinding"
      contract="IPoll" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />        
  </service>

我担心我必须为每个绑定的每个域编写一个端点,这将需要管理大量多余的配置。这个解决方案很棒,因为我不必这样做,它更简洁一些。

作为参考,这是我的 ServiceHostFactory 类。它非常简单,但它是必需的。完成此操作后,您还必须修改 .svc 文件的标记以包含 Factory:Factory="Api.ServiceHostFactory"

   public class MyServiceHostFactory : System.ServiceModel.Activation.ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {                        
        ServiceHost host;

        host = new ServiceHost(serviceType, baseAddresses[0]);

        return host;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单个 WCF 服务中的多个基地址 的相关文章

  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码
  • 在 Windows 中为 Apple 推送通知创建 p12 证书

    我正在用 C 为 iPhone 做推送通知 服务器端 我有 developer Push SSL certi cer 文件 如何从 cer 文件创建 p12 证书 或者我必须在我的电脑上安装上述 cer 文件 在服务器端发送推送通知所需的文
  • 如何使用 Linq 将实体表与交叉引用表连接起来

    首先我要说的是 我对 Linq 比较陌生 但我似乎很快就掌握了其中的大部分内容 但这个问题却难倒了我 我找了又找都没有结果 我使用代码优先并创建了 2 个模型 项目 和 关键字 他们之间存在多对多的关系 我的实体模型如下所示 public
  • 在方法/数据成员中向 WCF 添加限制

    我是 WCF 新手 我尝试对数据成员添加限制 例如在这个方法中 DataMember public string StringValue get return stringValue set stringValue value 我想设置最大
  • 如何使用 .net 2.0 中的 WebBrowser 控件检查 ajax 更新?

    我有一个网页正在使用 WebBrowser 控件在 winform 应用程序中显示 我需要在网页中的 HTML 发生变化时执行一个事件 但是 我找不到通过 Ajax 更新页面时触发的事件 DocumentComplete FileDownl
  • 从 DataGridViewSelectedRowCollection 复制列详细信息

    我有一个 DataGridView 它绑定到一个由设计时未知的 SQL 查询返回的 DataSet 好吧 我知道查询是什么 我只是不知道用户选择了哪一个 我允许用户从表中选择一组行并单击 确定 按钮 然后我想将这些行复制到新的 DataGr
  • 如何在Entity Framework 5中正确触发集合的延迟加载?

    我在我的应用程序中使用 EF5 代码优先 我有一个包含一些延迟加载字段的表 public class TestEntity public int Id get set public virtual TestEntity2 SubEntity
  • 实体框架中的 DbSet [重复]

    这个问题在这里已经有答案了 我在实体框架中有以下代码 using var dbc new TestDbContext var data from a in dbc tableList select new a id ToList 当我调试代
  • DBNull 怎么会不等于 DBNull

    我有以下代码行 if DBNull Value Equals o o null where o is object o in row ItemArray我不断收到错误 gt Xml type List of xdt untypedAtomi
  • 如何从互联网访问本地网络内的服务器

    假设我有一个服务器应用程序在未直接连接到互联网但通过路由器连接的计算机上工作 所以问题是如何从不在内部网络 从互联网 内的另一台计算机连接到该服务器 据我所知 管理员可以配置路由器将指定端口请求重定向到该计算机 但我可以自动执行此操作吗 我
  • 将 KeyDown 事件传递给其他控件

    我正在编写一个 C WinForms 应用程序 NET 4 0 我有一个WinFormsControl on a Form 用户开始使用键盘输入内容后 另一个Control出现 那Control是某种文本输入 我想将用户输入发送到该Cont
  • 有没有办法将对象(及其属性)序列化为 xml?

    创建一个类 将其命名为 FormElement 该类应该具有一些属性 例如它们具有数据元素的元数据 名称 序列号 值 只是一个字符串等 该类具有验证应用程序块验证类类型的属性 我想将其序列化为xml并反序列化 验证类的所有属性 包括验证应用
  • 从共享网络文件夹运行的 .NET 应用程序的性能损失

    从共享网络文件夹运行 NET 4 0 应用程序是否有任何性能损失 我发现哪个应用程序启动速度较慢 但 在使用时没有注意到任何变慢 但不确定 当通过网络运行可执行文件时 Windows 不会在应用程序启动时通过网络传输整个应用程序 这样做是为
  • 最小化文件夹

    我想使用 C 最小化窗口 例如 我已经打开了这条路径E using process start E 我想在某个事件上最小化这条路径 我怎样才能做到这一点 以下示例控制台应用程序代码将最小化在 E 上打开的所有 shell 资源管理器视图 c
  • 获取控制器视图上的列表数据

    我有一个视图 其中我在循环中渲染了部分视图 有一个列表 部分视图与列表中的每个项目绑定 输入值后 我没有在控制器上获取列表的值 这是我的观点 table class table width 100 border 0 thead tr sty
  • 按字母顺序对列表进行排序

    我有以下课程 class Detail public Detail details new List
  • TransactionScope 的细微差别

    假设我有两个线程 它们在特定于线程的 TransactionScope 中执行一些面向数据库的代码 并具有 ReadCommissed 隔离级别 但是有一些表的数据应该共享 不应创建重复项 using var transactionScop
  • 如何禁用 WebBrowser 控件中的点击声音

    我使用 Javascript 单击网络浏览器控件中的链接 但我不想听到IE的 咔哒 声 有什么办法可以做到这一点吗 P S 我不想更改系统设置 我见过这个 如何仅在您的应用程序中禁用网络浏览器 点击声音 https stackoverflo
  • 如何在 C# 中向肥皂信封添加命名空间

    我想向我的肥皂信封添加命名空间设置 我想在 IClientMessageInspector 的 BeforeSendRequest 中更改它 或者您有更优雅的方法 例如
  • File.Move 的原子性

    我想将目录中的文件重命名为原子事务 该文件不会更改目录 该路径作为 NTFS 文件系统的 UNC 路径提供 可能位于服务器 03 或 08 上 File Move 对于这些目的来说是原子的吗 例如 它要么成功完成 要么失败 以使原始文件仍然

随机推荐