C#:如何在运行时更新Visual Studio生成的xxx.exe.config绑定?
解决.NET 4.6中WCF绑定的运行时配置问题
我来帮你搞定这个WCF绑定配置的问题!在.NET 4.6里,你其实不用直接去修改xxx.exe.config文件,而是可以通过代码调整绑定参数后,直接关联到你的服务客户端或者宿主上——这比修改配置文件更灵活,也避免了文件读写的问题。下面分几种常见场景给你具体实现方案:
场景1:作为WCF服务客户端(调用远程服务)
如果你的项目是用来调用WCF服务的客户端,通过Visual Studio添加服务引用生成了客户端类(比如ContentServiceClient),你可以跳过配置文件的绑定设置,直接用代码修改后的绑定创建客户端实例:
using System.ServiceModel; using System.Configuration; // 1. 从配置文件读取服务地址(也可以直接硬编码,推荐从config维护) var serviceAddress = new EndpointAddress(ConfigurationManager.AppSettings["ContentServiceUrl"]); // 2. 初始化绑定并修改参数 BasicHttpBinding myBinding = new BasicHttpBinding("BasicHttpBinding_ContentService"); myBinding.MaxBufferSize = 5000000; myBinding.MaxBufferPoolSize = 524288; myBinding.MaxReceivedMessageSize = 2147483648; myBinding.TransferMode = TransferMode.Streamed; // 3. 用修改后的绑定创建客户端 using (var contentClient = new ContentServiceClient(myBinding, serviceAddress)) { // 调用你的服务方法 var result = contentClient.GetContent(); }
注意:把ContentServiceClient替换成你实际添加服务引用后生成的客户端类名即可。这种方式会直接覆盖配置文件中的绑定设置,优先使用代码里的参数。
场景2:作为WCF服务宿主(托管服务)
如果你是自己托管WCF服务(比如控制台程序、Windows服务),可以通过ServiceHost关联修改后的绑定。如果你的项目找不到ServiceHost类,记得先添加System.ServiceModel程序集的引用:
using System.ServiceModel; using System.Linq; // 1. 创建服务宿主,传入你的服务实现类 var serviceHost = new ServiceHost(typeof(ContentService)); // 2. 找到配置中对应的终结点并修改绑定 var targetEndpoint = serviceHost.Description.Endpoints .FirstOrDefault(e => e.Binding is BasicHttpBinding && e.Name == "BasicHttpBinding_ContentService"); if (targetEndpoint != null) { var binding = (BasicHttpBinding)targetEndpoint.Binding; // 应用你的参数设置 binding.MaxBufferSize = 5000000; binding.MaxBufferPoolSize = 524288; binding.MaxReceivedMessageSize = 2147483648; binding.TransferMode = TransferMode.Streamed; } // 3. 启动服务 serviceHost.Open(); Console.WriteLine("服务已启动,按任意键停止..."); Console.ReadLine(); // 关闭服务(生产环境建议用更安全的释放方式) serviceHost.Close();
特殊需求:直接修改磁盘上的.config文件(不推荐)
如果你一定要实际修改磁盘上的配置文件(注意:运行时修改可能导致服务重启或配置读取异常,不推荐),可以用Configuration类操作XML配置:
using System.Configuration; using System.ServiceModel.Configuration; // 加载当前应用的配置文件 var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); var serviceModelGroup = ServiceModelSectionGroup.GetSectionGroup(config); // 找到目标绑定并修改参数 var basicBindings = serviceModelGroup.Bindings.BasicHttpBindings; var targetBinding = basicBindings.Bindings["BasicHttpBinding_ContentService"] as BasicHttpBindingElement; if (targetBinding != null) { targetBinding.MaxBufferSize = 5000000; targetBinding.MaxBufferPoolSize = 524288; targetBinding.MaxReceivedMessageSize = 2147483648; targetBinding.TransferMode = TransferMode.Streamed; } // 保存修改到磁盘 config.Save(ConfigurationSaveMode.Modified); // 刷新配置,让后续读取生效 ConfigurationManager.RefreshSection("system.serviceModel");
提醒:这种方式修改的是磁盘上的.config文件,下次程序启动会生效,但当前运行的服务/客户端不会立即应用新配置,除非你重新初始化绑定或重启程序。
内容的提问来源于stack exchange,提问作者Ross Johnston
相关产品推荐
相关产品推荐

