通过环境变量动态指定 WCF 服务端点

Dynamically specify WCF Service endpoint by environment variable

我正在创建一个 MVVM 客户端应用程序,它使用 WCF 服务在数据库中执行 CRUD 操作。我还有 4 个使用相同服务的部署环境,但位于 4 个不同的服务器上。 所以这里有一些伪代码可以更好地解释:

在App.Config中:

 <appSettings>
<add key="Local.Server.Service" value="Local.Service" />
<add key="Development.Server.Service" value="Development.Service" />
<add key="Test.Server.Service" value="Test.Service" />
<add key="Pre-Prod.Server.Service" value="Pre-Prod.Service" />
<add key="Production.Server.Service" value="Production.Service" />

</appSettings>
   <system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IService" maxBufferPoolSize="2147483647" 
   maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="2147483647" 
    maxStringContentLength="2147483647" maxArrayLength="2147483647" 
      maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      <security mode="None" />
    </binding>
  </basicHttpBinding>
</bindings>
<services>
     <service name="Local.Service">
        <endpoint address="Local.address" 
  bindingConfiguration="BasicHttpBinding_IService"/>
     </service>
     <service name="Dev.Service">
        <endpoint address="Dev.address" 
  bindingConfiguration="BasicHttpBinding_IService"/>
     </service>
     <service name="Test.Service">
        <endpoint address="Test.address" 
bindingConfiguration="BasicHttpBinding_IService"/>
     </service>
     <service name="Prod.Service">
        <endpoint address="Prod.address" 
bindingConfiguration="BasicHttpBinding_IService"/>
     </service>

    </services>

在虚拟机中:

  private const string ENV_VARIABLE = "Test";
  public string GetServiceUri()
  {
       var uri = ConfigurationManager.AppSettings.Get(string.Concat(ENV_VARIABLE, ".Server.Service"));
       return uri;   
  }  

从这里我可以调用服务名称的 GetServiceUri,但我不知道如何获取服务的端点地址。

如有任何帮助,我们将不胜感激。

我最终更改了 app.config 文件以在单个客户端中包含不同的端点,而不是单独的服务,并调整了绑定配置,如下所示:

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IService" maxBufferPoolSize="2147483647"
      maxReceivedMessageSize="2147483647" />
    <binding name="BasicHttpBinding_IService" />
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="Local.address"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"
    contract="ServiceReference.IService"
    name="Local.BasicHttpBinding_IService" />
  <endpoint address="Dev.address"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"
    contract="ServiceReference.IService"
    name="Dev.BasicHttpBinding_IService" />
  <endpoint address="Test.address"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"
    contract="ServiceReference.IService"
    name="Test.BasicHttpBinding_IService" />
  <endpoint address="Prod.address"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"
    contract="ServiceReference.IService"
    name="BasicHttpBinding_IService" />
</client>
</system.serviceModel>