You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止CoreWCF基地址被Kestrel覆盖?

问题原因及解决方法

为什么UseUrls指定的URI被覆盖?

  1. Kestrel配置优先级差异:WebHost.UseNetTcp()是CoreWCF封装的Kestrel端点配置方法,它直接通过Kestrel核心API绑定NetTcp端点,优先级高于UseUrls(),因此后者的设置会被覆盖。
  2. 默认HTTP端点自动生成:WebApplication.CreateBuilder()会默认添加HTTP端点配置,当NetTcp配置与默认HTTP配置存在端口冲突时,Kestrel会回退到默认HTTP监听,这就是日志中出现http://127.0.0.1:8001的原因。
  3. 重复配置触发冲突:同时用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:07:26