我需要能够以编程方式更新我的配置文件并更改我的WCF设置。我一直在尝试使用我在网上找到的一些示例在一些测试代码中执行此操作,但因此无法获取配置文件以反映对端点地址的更改。
配置(摘录):
<!-- Sync Support -->
<service name="Server.ServerImpl"
behaviorConfiguration="syncServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/SyncServerHarness"/>
</baseAddresses>
</host>
<endpoint name="syncEndPoint"
address="http://localhost:8000/SyncServerHarness/Sync"
binding="basicHttpBinding"
contract="Server.IServer" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
代码:
Configuration config = ConfigurationManager.OpenExeConfiguration
(ConfigurationUserLevel.None);
ServiceModelSectionGroup section = (ServiceModelSectionGroup)
config.SectionGroups["system.serviceModel"];
foreach (ServiceElement svc in section.Services.Services)
{
foreach (ServiceEndpointElement ep in svc.Endpoints)
{
if (ep.Name == "syncEndPoint")
{
ep.Address = new Uri("http://192.168.0.1:8000/whateverService");
}
}
}
config.Save(ConfigurationSaveMode.Full);
ConfigurationManager.RefreshSection("system.serviceModel");
此代码执行时没有异常,但不进行任何更改。我也无法索引端点和服务。有没有一种简单的方法可以找到它?使用name作为索引器似乎不起作用。
谢谢!
西格
答案 0 :(得分:2)
我改变了两件事,对我来说效果很好:
1)我正在使用OpenExeConfiguration
和汇编路径
2)我正在访问<services>
部分,而不是<system.serviceModel>
部分
通过这两项更改,一切正常:
Configuration config = ConfigurationManager.OpenExeConfiguration
(Assembly.GetExecutingAssembly().Location);
ServicesSection section = config.GetSection("system.serviceModel/services")
as ServicesSection;
foreach (ServiceElement svc in section.Services)
{
foreach (ServiceEndpointElement ep in svc.Endpoints)
{
if (ep.Name == "syncEndPoint")
{
ep.Address = new Uri("http://192.168.0.1:8000/whateverService");
}
}
}
config.Save(ConfigurationSaveMode.Full);
答案 1 :(得分:1)
以防万一......如果您在调用RefreshSection方法后没有更新 app.config 时有一些奇怪的魔法,请确保不将其称为原帖:
ConfigurationManager.RefreshSection("system.serviceModel");
这种方式永远不会奏效。该调用只是被忽略并通过。而是这样称呼:
ConfigurationManager.RefreshSection("system.serviceModel/client");
您必须指定一个部分(客户端,绑定,行为,...)。如果需要更新整个配置,则迭代循环中的所有部分。 MSDN对此事保持沉默。我花了3天时间寻找这个垃圾。