首页 > 解决方案 > 如何使用 HttpClient 调用具有特定主机的 IP

问题描述

如何在使用 .NET HttpClient 对象指定主机信息时调用 IP?我们使用子域来区分主机,但我们还需要提供一个特定的 IP 来访问我们的测试环境服务器。

示例:我们想调用https://12.34.56.78但我们需要确保调用访问特定的子域(即https://specific_subdomain.company.com

标签: .nethttp-headersdotnet-httpclient

解决方案


您只需要提供一个 Host 标头来指定主机信息:

public async Task<TResult> GetAsync<TResult>(string subdomain, string endPoint)
{
    var siteUrl = $"https://{subdomain}.company.com/";
    var siteUri = new Uri(siteUrl);
    var client = new HttpClient {
        BaseAddress = new Uri($"https://{12.34.56.78}:443"),
        Timeout = new TimeSpan(0, 1, 0),
    };

    client.DefaultRequestHeaders.Add("Host", siteUri.Host);

    // Make the request.
    var result = await client.GetAsync($"/{endPoint}")
        .ConfigureAwait(false);
    var responseString = await result.Content.ReadAsStringAsync()
        .ConfigureAwait(false);

    return JsonConvert.DeserializeObject<TResult>(responseString);
}

如果您还需要在前面的代码中附加一些 cookie(即 auth cookie),您可以这样做:

public async Task<TResult> GetAsync<TResult>(string subdomain, string endPoint, Cookie cookie)
{
    var siteUrl = $"https://{subdomain}.company.com/";
    var siteUri = new Uri(siteUrl);
    var client = new HttpClient {
        BaseAddress = new Uri($"https://{12.34.56.78}:443"),
        Timeout = new TimeSpan(0, 1, 0),
    };

    client.DefaultRequestHeaders.Add("Host", siteUri.Host);
    client.DefaultRequestHeaders.Add("Cookie", $"{cookie.Name}={cookie.Value}");

    // Make the request.
    var result = await client.GetAsync($"/{endPoint}")
        .ConfigureAwait(false);
    var responseString = await result.Content.ReadAsStringAsync()
        .ConfigureAwait(false);

    return JsonConvert.DeserializeObject<TResult>(responseString);
}

推荐阅读