Как отправить http-запрос в asp.net, не ожидая ответа и не связывая ресурсы - PullRequest
10 голосов
/ 16 января 2009

В приложении 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 () для очистки или это может предотвратить отправку запроса по медленному соединению?

Ответы [ 2 ]

7 голосов
/ 16 января 2009

Я думаю Threadpool.QueueUserWorkItem - это то, что вы ищете. С добавлением лямбд и анонимных типов это может быть действительно простым:

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);
0 голосов
/ 09 мая 2009

Единственный способ, которым я могу думать о том, что вы получите быстрый ответ от другого запроса, - это иметь страницу, которую вы публикуете, чтобы открыть поток, используя ThreadPool.QueueUserWorkItem, чтобы основной поток завершил ответ раньше времени трудоемкая работа завершена. Вы должны знать, что после выхода из основного потока у вас не будет доступа к HttpContext, что означает отсутствие кэширования, серверных переменных и т. Д. Кроме того, общие диски не будут работать, если вы не выделили пользователя с разрешениями в новом потоке. Темы хорошие, но есть много вещей, на которые стоит обратить внимание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...