如何使用HttpClient与特定主机调用IP

问题描述

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

示例: 我们想拨打https://12.34.56.78的电话,但我们需要确保该电话访问的是特定的子域(即https://specific_subdomain.company.com

解决方法

您只需要提供一个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"),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);
}