如何防止CoreWCF基地址被Kestrel覆盖?
问题原因及解决方法
为什么UseUrls指定的URI被覆盖?
- Kestrel配置优先级差异:
WebHost.UseNetTcp()是CoreWCF封装的Kestrel端点配置方法,它直接通过Kestrel核心API绑定NetTcp端点,优先级高于UseUrls(),因此后者的设置会被覆盖。 - 默认HTTP端点自动生成:
WebApplication.CreateBuilder()会默认添加HTTP端点配置,当NetTcp配置与默认HTTP配置存在端口冲突时,Kestrel会回退到默认HTTP监听,这就是日志中出现http://127.0.0.1:8001的原因。 - 重复配置触发冲突:同时用
UseNetTcp()和UseUrls()设置同一端口的NetTcp地址,触发了Kestrel的配置覆盖逻辑,导致UseUrls()的设置被忽略。
解决方法
步骤1:移除冗余的UseUrls调用
UseNetTcp()已完成NetTcp端口的监听配置,无需通过UseUrls()重复设置,直接删除该行代码:
// 移除这行冗余配置 // builder.WebHost.UseUrls(string.Format("net.tcp://{0}:{1}", address, port));
步骤2:禁用Kestrel默认HTTP端点
通过直接配置Kestrel,禁用默认HTTP端点并明确绑定NetTcp监听:
// 替换原有的UseNetTcp调用,直接配置Kestrel builder.WebHost.UseKestrel(options => { options.Listen(System.Net.IPAddress.Parse(address), int.Parse(port), listenOptions => { listenOptions.UseNetTcp(); }); });
步骤3:保留CoreWCF端点配置
你的CoreWCF端点配置已正确指定/endpoint,无需修改,启动后服务会自动映射到net.tcp://127.0.0.1:8001/endpoint。
修改后的完整代码
var builder = WebApplication.CreateBuilder(); builder.Services.AddServiceModelServices(); // 直接配置Kestrel绑定NetTcp端点 builder.WebHost.UseKestrel(options => { options.Listen(System.Net.IPAddress.Parse(address), int.Parse(port), listenOptions => { listenOptions.UseNetTcp(); }); }); builder.Logging.AddConsole().AddDebug(); var service = builder.Build(); service.UseServiceModel(builder => { builder.AddService<ServiceImpl>(); builder.AddServiceEndpoint<ServiceImpl, IService>(binding, endpoint); }); Task startupTask = service.StartAsync(); startupTask.Wait();
验证结果
修改后启动服务,控制台会输出如下日志,说明NetTcp端点已正确监听:
info: Microsoft.Hosting.Lifetime[14] Now listening on: net.tcp://127.0.0.1:8001
此时net.tcp://127.0.0.1:8001/endpoint即可正常提供服务。
内容的提问来源于stack exchange,提问作者langecode
相关产品推荐
相关产品推荐

