Вызов веб-страницы из С# в коде

Мне нужен способ вызова веб-страницы из моего приложения .net.

Но я просто хочу отправить запрос на страницу и не беспокоиться об ответе.

Поскольку бывают случаи, когда ответ может занять некоторое время, поэтому я не хочу, чтобы приложение зависало.

Я пытался принять участие в событии page_load

WebClient webC = new WebClient();
Uri newUri = new Uri("http://localhost:49268/dosomething.aspx");
webC.UploadStringAsync(newUri, string.Empty);

Несмотря на то, что он установлен на асинхронный, он все равно зависает, поскольку страница не завершит рендеринг, пока потоки не закончатся.


person TheAlbear    schedule 19.11.2008    source источник


Ответы (7)


Это должно сработать для вас:

System.Net.WebClient client = new System.Net.WebClient();
client.DownloadDataAsync(new Uri("http://some.url.com/some/resource.html"));

Класс WebClient имеет события для уведомления вызывающей стороны о завершении запроса, но, поскольку вам все равно, в нем не должно быть ничего другого.

person ckramer    schedule 19.11.2008
comment
Я согласен, что это должно работать, но веб-страница не будет отображаться в браузере до тех пор, пока потоки не будут завершены, поэтому она все еще зависает. - person TheAlbear; 19.11.2008

Doak, Был почти готов, но каждый раз, когда я помещал какой-либо запрос в отдельный поток, страница все равно не отображалась до тех пор, пока не завершится выполнение всего потока.

Лучший способ, который я нашел, - это настроить метод Доака, просто вставить туда тайм-аут и проглотить ошибку.

Я знаю, что это хак, но он работает :P

WebRequest wr = WebRequest.Create("http://localhost:49268/dostuff.aspx");
wr.Timeout = 3500;

try
{
    HttpWebResponse response = (HttpWebResponse)wr.GetResponse();
}
catch (Exception ex)
{
    //We know its going to fail but that dosent matter!!
}
person TheAlbear    schedule 19.11.2008
comment
Я нашел, что лучше всего дать ему 3-5 секунд до тайм-аута. - person TheAlbear; 22.11.2010
comment
Настройте блок catch, если хотите узнать, был ли тайм-аут причиной исключения: catch (WebException ex) { if (ex.Status!=WebExceptionStatus.Timeout) throw ex; } - person Daniel Calliess; 01.08.2017

Чтобы приложение не зависало, вам нужно будет вызвать метод из потока.

Для HTTP-запроса без ответа должно работать что-то вроде этого:

Thread myThread = new Thread(new ThreadStart(myMethodThatDoHttp));
    myThread.Start();
public void myMethodThatDoHttp()
{
    HttpWebRequest request  = (HttpWebRequest)WebRequest.Create("http://www..com");
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
}
person Patrick Desjardins    schedule 19.11.2008

Посмотрите на System.Net.WebClient, в частности используйте DownloadDataAsync() для отправки запроса без блокировки остальной части приложения .

person Joel Coehoorn    schedule 19.11.2008

Чтобы этот процесс не прерывал поток страниц вашей текущей страницы, я бы рекомендовал создать службу WCF, которая будет выполнять код для вас. Настройте службу на использование односторонних вызовов и на странице инициируйте Ajax-вызов службы.

person Chris Marisic    schedule 19.11.2008
comment
Мне нравится мой сервис и сайт в одном проекте и надоели друг другу, проблема любого windows сервиса в том что 1. он может крашиться, вы второй сервис пишете чтобы отловить краш? поймайте 22, и нет усталой зависимости, если вы перемещаете серверы / хосты, сервер сбрасывается через вашего провайдера, об услуге можно легко забыть. - person TheAlbear; 22.11.2010
comment
WCF часто размещается внутри IIS, поэтому, хотя иногда домен приложения может привести к сбою ASP.NET и, возможно, к потере запроса или 2, это не очень частое явление. Я не уверен, что спрашивает 2-я часть - person Chris Marisic; 23.11.2010

  1. Насколько я вижу, метод «BeginGetResponse» и метод «EndGetResponse» объекта HttpWebRequest (полученный посредством вызова WebRequest.Create), соответственно. методы BeginGetRequestStream-/EndGetRequestStream ЗДЕСЬ еще не отражены, хотя они ЯВНО помечены как "асинхронный запрос" в документах:

    Без понятия, как это работает.

  2. Если вызываемая страница находится в том же IIS/App. в качестве вызова вы можете написать фильтр, который завершает все обслуживание этого запроса к клиенту (ваша «вызывающая» aspx-страница), если строка карты содержит спецификацию вызываемой страницы (в ISAPI-cpp: «return SF_STATUS_REQ_FINISHED;") Но, возможно, ваше выполнение asp/x/-script на вызываемой странице тоже убито. Вопрос проверки.

  3. Рассмотрите возможность использования директив включения на стороне сервера (менее условных) или динамического вызова ASP-файла с помощью Server.Execute.

  4. Не совсем асинхронный, но, возможно, достойный: явно заявите с помощью РАННЕГО Response.End() (или аналогичного) НА ВЫЗЫВАЕМОЙ СТРАНИЦЕ системе, что НИКАКОГО ДАЛЬНЕЙШЕГО ОТВЕТА не следует ожидать, в основном НЕ вызывающему абоненту. Затем продолжайте свои дела в сценариях ВЫЗЫВАЕМОЙ страницы. По крайней мере, временной сдвиг для ожидания окончания вызова синхронизации может быть минимизирован с помощью fac, равного 10, 100 или около того.

person dos    schedule 10.03.2014

Используйте System.Net.WebClient.DownloadDataAsync/DownloadFileAsync в сочетании с DownloadDataCompleted/DownloadFileCompleted.

person baretta    schedule 19.11.2008
comment
Это по-прежнему заставляет вызывающий поток зависать до тех пор, пока не завершится асинхронный поток. - person TheAlbear; 16.11.2011