如何在Blazor WebAssembly服务端获取Host与Port属性?
在Blazor WebAssembly服务端Startup.cs中自动获取Host和Port
当然可以在服务端的Startup.cs里实现自动获取Host和Port的需求,根据服务端的运行场景,有几种实用的实现方式:
方案1:通过服务器地址特性获取Kestrel监听地址
在Startup.cs的Configure方法中,你可以通过IServerAddressesFeature直接拿到Kestrel实际绑定的监听地址,不管是本地调试、Azure部署还是Docker容器,只要服务器正确启动就能获取到:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { var serverAddresses = app.ServerFeatures.Get<IServerAddressesFeature>(); if (serverAddresses != null) { foreach (var address in serverAddresses.Addresses) { var uri = new Uri(address); string host = uri.Host; int port = uri.Port; // 可将host和port存入全局变量、配置类,供后续逻辑调用 } } // 其他中间件配置逻辑... }
方案2:通过HttpContext获取用户实际访问的Host和Port
如果你的需求是在处理请求时获取用户实际访问的地址(比如经过反向代理后的外部地址),可以在中间件或控制器中通过HttpContext.Request.Host获取:
// 示例:在自定义中间件中获取 app.Use(async (context, next) => { string host = context.Request.Host.Host; int port = context.Request.Host.Port ?? 80; // 无端口时默认用80 // 在这里使用host和port await next(); });
注意:这种方式只能在有请求上下文的阶段使用,ConfigureServices阶段还没有HttpContext,无法用这个方法。
场景适配提示
- Azure App Service部署时:
IServerAddressesFeature拿到的是Kestrel内部监听的端口,而HttpContext.Request.Host会返回用户实际访问的域名和端口,按需选择即可。 - Docker容器部署时:如果用了端口映射,
IServerAddressesFeature拿到的是容器内部端口,若要获取宿主机的外部访问端口,要么在启动容器时通过环境变量传递,要么在请求上下文里用HttpContext.Request.Host获取。
内容的提问来源于stack exchange,提问作者Stavros Koureas
相关产品推荐
相关产品推荐

