通过环境变量动态指定 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>
我正在创建一个 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>