mirror of
https://github.com/Sarsoo/Spotify.NET.git
synced 2024-12-24 23:16:28 +00:00
Modified SpotifyWebClient to use a single HttpClient per class lifeti… (#287)
* Modified SpotifyWebClient to use a single HttpClient per class lifetime. This will allow the HttpClient to properly pool connections. Reference: https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client * Added suggested changes. Moved ProxyConfig to the constructor of SpotifyWebClient.
This commit is contained in:
parent
81fe1763f4
commit
fa0f3e2d90
@ -23,15 +23,14 @@ namespace SpotifyAPI.Web
|
|||||||
{
|
{
|
||||||
_builder = new SpotifyWebBuilder();
|
_builder = new SpotifyWebBuilder();
|
||||||
UseAuth = true;
|
UseAuth = true;
|
||||||
WebClient = new SpotifyWebClient
|
WebClient = new SpotifyWebClient(proxyConfig)
|
||||||
{
|
{
|
||||||
JsonSettings =
|
JsonSettings =
|
||||||
new JsonSerializerSettings
|
new JsonSerializerSettings
|
||||||
{
|
{
|
||||||
NullValueHandling = NullValueHandling.Ignore,
|
NullValueHandling = NullValueHandling.Ignore,
|
||||||
TypeNameHandling = TypeNameHandling.All
|
TypeNameHandling = TypeNameHandling.All
|
||||||
},
|
}
|
||||||
ProxyConfig = proxyConfig
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,10 +13,14 @@ namespace SpotifyAPI.Web
|
|||||||
internal class SpotifyWebClient : IClient
|
internal class SpotifyWebClient : IClient
|
||||||
{
|
{
|
||||||
public JsonSerializerSettings JsonSettings { get; set; }
|
public JsonSerializerSettings JsonSettings { get; set; }
|
||||||
|
|
||||||
public ProxyConfig ProxyConfig { get; set; }
|
|
||||||
|
|
||||||
private readonly Encoding _encoding = Encoding.UTF8;
|
private readonly Encoding _encoding = Encoding.UTF8;
|
||||||
|
private readonly HttpClient _client;
|
||||||
|
|
||||||
|
public SpotifyWebClient(ProxyConfig proxyConfig = null)
|
||||||
|
{
|
||||||
|
HttpClientHandler clientHandler = CreateClientHandler(proxyConfig);
|
||||||
|
_client = new HttpClient(clientHandler);
|
||||||
|
}
|
||||||
|
|
||||||
public Tuple<ResponseInfo, string> Download(string url, Dictionary<string, string> headers = null)
|
public Tuple<ResponseInfo, string> Download(string url, Dictionary<string, string> headers = null)
|
||||||
{
|
{
|
||||||
@ -32,47 +36,39 @@ namespace SpotifyAPI.Web
|
|||||||
|
|
||||||
public Tuple<ResponseInfo, byte[]> DownloadRaw(string url, Dictionary<string, string> headers = null)
|
public Tuple<ResponseInfo, byte[]> DownloadRaw(string url, Dictionary<string, string> headers = null)
|
||||||
{
|
{
|
||||||
HttpClientHandler clientHandler = CreateClientHandler(ProxyConfig);
|
if (headers != null)
|
||||||
using (HttpClient client = new HttpClient(clientHandler))
|
|
||||||
{
|
{
|
||||||
if (headers != null)
|
foreach (KeyValuePair<string, string> headerPair in headers)
|
||||||
{
|
{
|
||||||
foreach (KeyValuePair<string, string> headerPair in headers)
|
_client.DefaultRequestHeaders.TryAddWithoutValidation(headerPair.Key, headerPair.Value);
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.TryAddWithoutValidation(headerPair.Key, headerPair.Value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
using (HttpResponseMessage response = Task.Run(() => client.GetAsync(url)).Result)
|
}
|
||||||
|
using (HttpResponseMessage response = Task.Run(() => _client.GetAsync(url)).Result)
|
||||||
|
{
|
||||||
|
return new Tuple<ResponseInfo, byte[]>(new ResponseInfo
|
||||||
{
|
{
|
||||||
return new Tuple<ResponseInfo, byte[]>(new ResponseInfo
|
StatusCode = response.StatusCode,
|
||||||
{
|
Headers = ConvertHeaders(response.Headers)
|
||||||
StatusCode = response.StatusCode,
|
}, Task.Run(() => response.Content.ReadAsByteArrayAsync()).Result);
|
||||||
Headers = ConvertHeaders(response.Headers)
|
|
||||||
}, Task.Run(() => response.Content.ReadAsByteArrayAsync()).Result);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Tuple<ResponseInfo, byte[]>> DownloadRawAsync(string url, Dictionary<string, string> headers = null)
|
public async Task<Tuple<ResponseInfo, byte[]>> DownloadRawAsync(string url, Dictionary<string, string> headers = null)
|
||||||
{
|
{
|
||||||
HttpClientHandler clientHandler = CreateClientHandler(ProxyConfig);
|
if (headers != null)
|
||||||
using (HttpClient client = new HttpClient(clientHandler))
|
|
||||||
{
|
{
|
||||||
if (headers != null)
|
foreach (KeyValuePair<string, string> headerPair in headers)
|
||||||
{
|
{
|
||||||
foreach (KeyValuePair<string, string> headerPair in headers)
|
_client.DefaultRequestHeaders.TryAddWithoutValidation(headerPair.Key, headerPair.Value);
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.TryAddWithoutValidation(headerPair.Key, headerPair.Value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
using (HttpResponseMessage response = await client.GetAsync(url).ConfigureAwait(false))
|
}
|
||||||
|
using (HttpResponseMessage response = await _client.GetAsync(url).ConfigureAwait(false))
|
||||||
|
{
|
||||||
|
return new Tuple<ResponseInfo, byte[]>(new ResponseInfo
|
||||||
{
|
{
|
||||||
return new Tuple<ResponseInfo, byte[]>(new ResponseInfo
|
StatusCode = response.StatusCode,
|
||||||
{
|
Headers = ConvertHeaders(response.Headers)
|
||||||
StatusCode = response.StatusCode,
|
}, await response.Content.ReadAsByteArrayAsync());
|
||||||
Headers = ConvertHeaders(response.Headers)
|
|
||||||
}, await response.Content.ReadAsByteArrayAsync());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,57 +98,49 @@ namespace SpotifyAPI.Web
|
|||||||
|
|
||||||
public Tuple<ResponseInfo, byte[]> UploadRaw(string url, string body, string method, Dictionary<string, string> headers = null)
|
public Tuple<ResponseInfo, byte[]> UploadRaw(string url, string body, string method, Dictionary<string, string> headers = null)
|
||||||
{
|
{
|
||||||
HttpClientHandler clientHandler = CreateClientHandler(ProxyConfig);
|
if (headers != null)
|
||||||
using (HttpClient client = new HttpClient(clientHandler))
|
|
||||||
{
|
{
|
||||||
if (headers != null)
|
foreach (KeyValuePair<string, string> headerPair in headers)
|
||||||
{
|
{
|
||||||
foreach (KeyValuePair<string, string> headerPair in headers)
|
_client.DefaultRequestHeaders.TryAddWithoutValidation(headerPair.Key, headerPair.Value);
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.TryAddWithoutValidation(headerPair.Key, headerPair.Value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
HttpRequestMessage message = new HttpRequestMessage(new HttpMethod(method), url)
|
HttpRequestMessage message = new HttpRequestMessage(new HttpMethod(method), url)
|
||||||
|
{
|
||||||
|
Content = new StringContent(body, _encoding)
|
||||||
|
};
|
||||||
|
using (HttpResponseMessage response = Task.Run(() => _client.SendAsync(message)).Result)
|
||||||
|
{
|
||||||
|
return new Tuple<ResponseInfo, byte[]>(new ResponseInfo
|
||||||
{
|
{
|
||||||
Content = new StringContent(body, _encoding)
|
StatusCode = response.StatusCode,
|
||||||
};
|
Headers = ConvertHeaders(response.Headers)
|
||||||
using (HttpResponseMessage response = Task.Run(() => client.SendAsync(message)).Result)
|
}, Task.Run(() => response.Content.ReadAsByteArrayAsync()).Result);
|
||||||
{
|
|
||||||
return new Tuple<ResponseInfo, byte[]>(new ResponseInfo
|
|
||||||
{
|
|
||||||
StatusCode = response.StatusCode,
|
|
||||||
Headers = ConvertHeaders(response.Headers)
|
|
||||||
}, Task.Run(() => response.Content.ReadAsByteArrayAsync()).Result);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Tuple<ResponseInfo, byte[]>> UploadRawAsync(string url, string body, string method, Dictionary<string, string> headers = null)
|
public async Task<Tuple<ResponseInfo, byte[]>> UploadRawAsync(string url, string body, string method, Dictionary<string, string> headers = null)
|
||||||
{
|
{
|
||||||
HttpClientHandler clientHandler = CreateClientHandler(ProxyConfig);
|
if (headers != null)
|
||||||
using (HttpClient client = new HttpClient(clientHandler))
|
|
||||||
{
|
{
|
||||||
if (headers != null)
|
foreach (KeyValuePair<string, string> headerPair in headers)
|
||||||
{
|
{
|
||||||
foreach (KeyValuePair<string, string> headerPair in headers)
|
_client.DefaultRequestHeaders.TryAddWithoutValidation(headerPair.Key, headerPair.Value);
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.TryAddWithoutValidation(headerPair.Key, headerPair.Value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
HttpRequestMessage message = new HttpRequestMessage(new HttpMethod(method), url)
|
HttpRequestMessage message = new HttpRequestMessage(new HttpMethod(method), url)
|
||||||
|
{
|
||||||
|
Content = new StringContent(body, _encoding)
|
||||||
|
};
|
||||||
|
using (HttpResponseMessage response = await _client.SendAsync(message))
|
||||||
|
{
|
||||||
|
return new Tuple<ResponseInfo, byte[]>(new ResponseInfo
|
||||||
{
|
{
|
||||||
Content = new StringContent(body, _encoding)
|
StatusCode = response.StatusCode,
|
||||||
};
|
Headers = ConvertHeaders(response.Headers)
|
||||||
using (HttpResponseMessage response = await client.SendAsync(message))
|
}, await response.Content.ReadAsByteArrayAsync());
|
||||||
{
|
|
||||||
return new Tuple<ResponseInfo, byte[]>(new ResponseInfo
|
|
||||||
{
|
|
||||||
StatusCode = response.StatusCode,
|
|
||||||
Headers = ConvertHeaders(response.Headers)
|
|
||||||
}, await response.Content.ReadAsByteArrayAsync());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,6 +158,7 @@ namespace SpotifyAPI.Web
|
|||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
_client.Dispose();
|
||||||
GC.SuppressFinalize(this);
|
GC.SuppressFinalize(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user