为每个http客户端调用设置默认标头

时间:2017-01-31 10:03:01

标签: c# asp.net-web-api asp.net-web-api2

我想为UserHttpClient中的每个方法设置一个默认标头,但我不希望每个方法都这样做,我想以一般方式进行。

我在当前实现中看到的问题是,当我调用一个方法时,_client被释放,因此在Http请求中的下一次调用中,_client没有被初始化,因为这发生在构造函数中。

根据Http Request,通过DI注册UserHttpClient。

我也不想创建一个私有/基本方法,我传递_client并在那里添加标题。

你会如何解决这个问题?

   public class UserHttpClient : IUserRemoteRepository
    {
        private readonly string baseUrl = ConfigurationManager.AppSettings["baseUrl"];
        private readonly string header = ConfigurationManager.AppSettings["userHeader"];

        private readonly HttpClient _client;
        public ServiceProductDataProvider(string toolSystemKeyHeader)
        {
            _client = new HttpClient();
            _client.DefaultRequestHeaders.Add(header, token);
        }

        public async Task<List<UserDto>> GetUsers(UserRequestDto dto)
        {
            using (_client)
            {              

                // do stuff
                var users = await _client.GetAsync("url here");

            }
        }

        public async Task<UserDto> GetUser(Guid userId)
        {
            using (_client)
            {              

                // do stuff
                var users = await _client.GetAsync("url here");

            }
        }   
    }

1 个答案:

答案 0 :(得分:0)

班级UserHttpClient的成员为IDisposableprivate readonly HttpClient _client;)。这意味着UserHttpClient也应该实现IDisposable

public void Dispose() 
{
    _client.Dispose();
}

然后,正在使用UserHttpClient的类/代码负责在完成它之后对其进行处理。如果注入实例,那么您使用的DI框架可能会在请求结束时自动处理它。那么剩下的就是从实现中删除using块:

public async Task<List<UserDto>> GetUsers(UserRequestDto dto)
{
    // do stuff
    var users = await _client.GetAsync("url here");
}

----编辑----

你也可以通过而不是重用HttpClient解决问题:

private string _toolSystemKeyHeader;
public ServiceProductDataProvider(string toolSystemKeyHeader)
{
    _toolSystemKeyHeader = toolSystemKeyHeader
}
private HttpClient GetClientInstance()
{
    HttpClient _client = new HttpClient();
    _client.DefaultRequestHeaders.Add(header, _toolSystemKeyHeader); //?? in your original code, the toolSystemKeyHeader is not used, but I guess it is the token..?
    return _client;
}

public async Task<List<UserDto>> GetUsers(UserRequestDto dto)
{
    using (var _client = GetClientInstance())
    {              
        // do stuff
        var users = await _client.GetAsync("url here");
    }
}