Как отправить 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, что означает отсутствие кеширования, серверных переменных и т.д. Также общие диски не будут работать, если вы не одержите себя за пользователя с разрешениями в новом потоке. Темы хороши, но есть много вещей, которые нужно искать.