ASP.Net Web.config 客户端端点名称

ASP.Net Web.config client endpoint name

我有一个服务引用了其他服务,其中一些引用了同一服务的不同环境(例如 prod/test)。

我正在使用 #if 预编译指令将这些引用的不同版本包含在 using 语句中。示例:

#if Debug
using ServiceTest
#else
using ServiceProd
#endif

Web.config 文件中,我在 <client> 节点内有两个子节点。示例:

<client>
  <endpoint address="http://test.domain.com/Service"
    binding="basicHttpBinding" bindingConfiguration="Service"
    contract="ServiceTest" name="Service" />
  <endpoint address="http://prod.domain.com/Service"
    binding="basicHttpBinding" bindingConfiguration="Service"
    contract="ServiceProd" name="Service" />
</client>

Web.config的以上部分是否有效?更准确地说,由于两个端点具有相同的名称和绑定配置,是否会产生任何副作用?主要问题是调用了错误的端点(例如,调用 prod 端点而不是测试或相反)。

任何关于上述内容的指导和建议将不胜感激。

Is the above part of the Web.config valid or not?

每次当您 运行 您的应用程序 CLR 读取 web.config 文件并将其反序列化为一个对象。要反序列化 XML,它会在配置文件的 "configSections" 部分使用 类 声明。 因此,答案 "valid or not" 取决于 "client" 配置部分的实现。我相信这应该是您的应用程序或来自 nuget 库的代码的一部分。这就是我们无法自信地回答您的原因。

More precisely, can there be any side-effects because of having two endpoints with the same name and binding configurations?

坦率地说,我不明白这应该如何工作。第三个库应该以什么方式知道它需要首先加载而不是第二个客户端端点?

可能的解决方案.

您可以使用 web.config transformation。关于 .NET Framework 的此功能,有大量资源。

  1. 最简单的方案是替换端点地址,保持相同的端点名称。

  2. 另一种常见情况是提供不同的端点名称并在 AppSettings 中保留 "alive" 端点名称。在这种情况下,您的代码应首先解析端点名称,然后再解析实际端点地址。