Как отправить HTTP-запрос в asp.net, не дожидаясь ответа и не связывая ресурсы
В приложении ASP.Net мне нужно отправить некоторые данные (urlEncodedUserInput) через http POST на внешний сервер в ответ на ввод пользователя, не дожидаясь ответа на страницу. Неважно, какой ответ от другого сервера, и мне все равно, если запрос иногда не срабатывает. Кажется, что он работает нормально (см. Ниже), но я обеспокоен тем, что он связывает ресурсы в фоновом режиме, ожидая ответа, который никогда не будет использоваться.
Здесь код:
httpRequest = WebRequest.Create(externalServerUrl);
httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
bytedata = Encoding.UTF8.GetBytes(urlEncodedUserInput);
httpRequest.ContentLength = bytedata.Length;
requestStream = httpRequest.GetRequestStream();
requestStream.Write(bytedata, 0, bytedata.Length);
requestStream.Close();
Довольно стандартный материал, но обычно на этом этапе вы вызываете httpRequest.getResponse() или httpRequest.beginGetResponse(), если хотите получить асинхронный ответ, но это не кажется необходимым в моем сценарии.
Я поступаю правильно? Должен ли я вызвать httpRequest.Abort() для очистки или может ли это предотвратить отправку запроса при медленном соединении?
Ответы
Ответ 1
Я думаю, Threadpool.QueueUserWorkItem - это то, что вы ищете. С добавлением lambdas и анонимных типов это может быть очень просто:
var request = new { url = externalServerUrl, input = urlEncodedUserInput };
ThreadPool.QueueUserWorkItem(
(data) =>
{
httpRequest = WebRequest.Create(data.url);
httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
bytedata = Encoding.UTF8.GetBytes(data.input);
httpRequest.ContentLength = bytedata.Length;
requestStream = httpRequest.GetRequestStream();
requestStream.Write(bytedata, 0, bytedata.Length);
requestStream.Close();
//and so on
}, request);
Ответ 2
Единственный способ, по которому я могу думать, что вы получите быстрый ответ от другого запроса, - это иметь страницу, которую вы публикуете, чтобы открыть поток, используя ThreadPool.QueueUserWorkItem, чтобы основной поток заканчивал ответ до времени трудоемкая работа завершена. Вы должны знать, что после выхода основного потока у вас не будет доступа к HttpContext, что означает отсутствие кеширования, серверных переменных и т.д. Также общие диски не будут работать, если вы не одержите себя за пользователя с разрешениями в новом потоке. Темы хороши, но есть много вещей, которые нужно искать.