当前位置:首页 > 行业动态 > 正文

如何在C中获取域名及端口号?

在C#中可通过HttpContext或Uri获取域名及端口号,使用Request.Url.Host获取域名,Request.Url.Port提取端口号,若端口为80/443可省略,通过字符串拼接生成完整域名+端口格式。

使用HttpRequest对象

在ASP.NET框架中,可通过HttpContext直接获取请求的域名和端口信息。

// 传统ASP.NET(Web Forms/MVC)
var request = HttpContext.Current.Request;
string domain = request.Url.Host;
int port = request.Url.Port;
string domainWithPort = $"{domain}:{port}";
// ASP.NET Core
var request = HttpContext.Request;
string domain = request.Host.Host;
int port = request.Host.Port ?? (request.IsHttps ? 443 : 80);
string domainWithPort = port is 80 or 443 ? domain : $"{domain}:{port}";

说明

  • Host属性直接包含域名和端口(如未隐藏)。
  • 在ASP.NET Core中,Host类型为HostString,需通过Port属性提取端口。
  • 若端口为默认值(HTTP 80或HTTPS 443),通常不需要显式展示。

处理特殊场景

反向代理或负载均衡

若服务部署在Nginx或IIS ARR后,需从转发头(如X-Forwarded-Host)获取真实域名和端口:

// ASP.NET Core
var forwardedHost = HttpContext.Request.Headers["X-Forwarded-Host"].FirstOrDefault();
if (!string.IsNullOrEmpty(forwardedHost))
{
    domainWithPort = forwardedHost;
}

动态拼接协议和域名

生成完整URL时,需结合协议(HTTP/HTTPS):

string protocol = request.IsHttps ? "https://" : "http://";
string fullUrl = $"{protocol}{domainWithPort}";

注意事项

  1. 默认端口隐藏
    用户访问http://example.com时,URL中无端口信息,代码需自动过滤默认端口。
  2. 安全性验证
    从请求头获取数据时,需验证来源可信,防止改动(如X-Forwarded-Host注入攻击)。
  3. 多环境配置
    开发环境与生产环境的端口可能不同,建议通过配置文件管理。

常见问题

Q:获取的端口始终为服务器内部端口,而非用户实际访问的端口,如何处理?
A:检查反向代理配置,确保正确传递X-Forwarded-*请求头,并在代码中优先读取这些信息。

Q:本地调试时为何获取的域名是localhost
A:开发环境下,IIS Express或Kestrel默认绑定localhost,需在启动配置(如launchSettings.json)中修改绑定地址。


参考来源

  • Microsoft官方文档:ASP.NET Core Request Host
  • OWASP安全指南:Forwarded Headers处理
0