Я работал над прокси-подобным контроллером на ASP. NET, он берет URL-адрес из входящего запроса и использует HttpClient для вызова URL-адреса, а затем возвращает файл.
Этот прокси-подобный Контроллер работает следующим образом:
- Работает нормально при выполнении одного запроса
- Работает нормально при выполнении нескольких запросов, эти ответы имеют тип содержимого "application / json" и "xml "
- Тайм-аут запроса на 2-й запрос и задание отменено при выполнении 4 запросов, эти ответы имеют тип содержимого" image / png ". Например:
(Эти 4 запроса отправляются контроллеру почти одновременно).
- Запрос 1 - начало в 0 с, завершается в 1 с
- Запрос 2 - запуск в 1 с, тайм-аут и исключение в 11:00 (время ожидания 10 с), сервер зависает до истечения времени ожидания
- Запрос 3 - начало в 11 с, завершается в 12 с
- Запрос 4 - начало в 12 с, окончание в 13 с
Пожалуйста, игнорируйте ситуацию POST
Контроллер
public async Task<FileStreamResult> Proxy(string method, string url, string data = "")
{
myHttpClient client = new myHttpClient();
Tuple<MemoryStream,string> result = await client.Proxy(this.Request, method, url).ConfigureAwait(false);
return File(result.Item1,result.Item2); //file stream and file type
}
HttpClient
public class myHttpClient
{
private static HttpClient _httpClient;
static myHttpClient()
{
if (_httpClient == null) {
_httpClient = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });
_httpClient.Timeout = TimeSpan.FromSeconds(7);
Log ocLog = new Log();
ocLog.Write("init client " + ServicePointManager.DefaultConnectionLimit ,false);
}
}
public async Task<Tuple<MemoryStream, string>> Proxy(HttpRequestBase contextRequest, string method, string url)
{
var request = new HttpRequestMessage();
request.RequestUri = new Uri("http://localhost" + url);
if (method == "GET")
{
request.Method = HttpMethod.Get;
request.Content = null;
}
else if (method == "POST")
{
request.Method = HttpMethod.Post;
}
//copy request header from context.Request
foreach (string headerName in contextRequest.Headers)
{
string[] headerValues = contextRequest.Headers.GetValues(headerName);
if (!request.Headers.TryAddWithoutValidation(headerName, headerValues))
{
request.Content.Headers.TryAddWithoutValidation(headerName, headerValues);
}
}
try
{
using (HttpResponseMessage response = await _httpClient.SendAsync(request).ConfigureAwait(false))
{
if (response.IsSuccessStatusCode)
{
var contentBytes = await response.Content.ReadAsByteArrayAsync().ConfigureAwait(false);
MemoryStream ms = new MemoryStream(contentBytes);
return new Tuple<MemoryStream, string>(ms, response.Content.Headers.ContentType.ToString());
}
else
{
return null;
}
}
}
catch (Exception ex)
{
throw ex;
}
}
}
Что я пробовал
- Проверка ServicePointManager .DefaultConnectionLimit. Он очень большой.
- Использовать System. net .WebRequest библиотека вместо HttpClient, все тот же.