.NET - Использование файла WebClient.Download в одностороннем веб-сервисе - PullRequest
0 голосов
/ 14 июля 2010

В моем веб-приложении на C # .NET есть простой односторонний веб-сервис.Мне нужно скачать изображение с данного URL и сохранить его на моем сервере.

Однако, каждый раз, когда я звоню в сервис, он работает отлично.В другой раз я получаю исключение «Поток был прерван» в строке webClient.DownloadFile.

Я читал, что WebClient использует httpWebRequest, который требует доступа к HttpContext.Current.Это правда?Если так, то почему он может получить к нему доступ буквально через раз?

Я пытался добавить следующие строки перед моим вызовом:

Служба WebService = new WebService ();
HttpContext.Current = service.Context;

Ноэто не имеет значения.

Я запустил службу 10 раз, вот результаты:

1: Успех

2: Исключение: поток был прерван.Трассировка стека: в System.Net.ConnectStream.Read (буфер Byte [], смещение Int32, размер Int32) в System.Net.WebClient.DownloadBitsState.RetrieveBytes (Int32 & bytesRetrieved) в System.Net.WebClient.DownloadBits (запрос WebRequest, потокwriteStream, CompletionDelegate completeDelegate, AsyncOperation asyncOp) в System.Net.WebClient.DownloadFile (адрес Uri, строковое имя файла) ...

3: успех

4: исключение: поток был прерван.Трассировка стека: в System.Net.ConnectStream.Read (буфер Byte [], смещение Int32, размер Int32) в System.Net.WebClient.DownloadBitsState.RetrieveBytes (Int32 & bytesRetrieved) в System.Net.WebClient.DownloadBits (запрос WebRequest, потокwriteStream, CompletionDelegate completeDelegate, AsyncOperation asyncOp) в System.Net.WebClient.DownloadFile (адрес Uri, строковое имя файла) ...

5: успех

6: исключение: поток был прерван.Трассировка стека: в System.Net.WebClient.DownloadBitsState.SetResponse (ответ WebResponse) в System.Net.WebClient.DownloadBits (запрос WebRequest, поток writeStream, асинхронное завершение Deelegate, AsyncOperation asyncOp) в System.Net.WareF (System.Net.WebF)Строка fileName) ...

7: успех

8: исключение: поток был прерван.Трассировка стека: в System.Net.WebClient.DownloadBitsState.SetResponse (ответ WebResponse) в System.Net.WebClient.DownloadBits (запрос WebRequest, поток writeStream, асинхронное завершение Deelegate, AsyncOperation asyncOp) в System.Net.WareF (System.Net.WebF)Строка fileName) ...

9: Успех

10: Исключение: поток был прерван.Трассировка стека: в System.Net.WebClient.DownloadBitsState.SetResponse (ответ WebResponse) в System.Net.WebClient.DownloadBits (запрос WebRequest, поток writeStream, асинхронное завершение Deelegate, AsyncOperation asyncOp) в System.Net.WareF (System.Net.WebF)String fileName) ...

Можно ли как-нибудь это сделать ??Все довольно просто.

[WebService(Namespace = "http://nerdliness.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService()]
[System.ComponentModel.ToolboxItem(false)]      
public class FileProcessor : System.Web.Services.WebService
{

    [WebMethod]
    [SoapDocumentMethod(OneWay = true)]
    public void ParseFile(String urlOfFileToGrab, String destinationPath)
    {
          try
          {
               WebClient client = new WebClient();
               client.DownloadFile(urlOfFileToGrab, destinationPath);
               client.Dispose();
           }
           catch (Exception ex)
           {  
              //Log it
           }
    }
}

Ответы [ 2 ]

0 голосов
/ 14 июля 2010

ОК, огромный поворот событий, и я прошу прощения за то, что не исследовал так тщательно, как следовало бы до публикации (хотя я работал над этим в течение двух дней ...) Эта вещь httpContext была долгойWild Goose Chase: (

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

Моя проблема сейчас:

У меня есть объект со списком моих собственных (не System.Web.Drawing) объектов ImageFile. Прежде чем я использую webClient для загрузки новых файлов,Я делаю вызов, который сначала удаляет все текущие файлы ImageFile из объекта.Этот вызов проходит по списку и для каждого ImageFile делает следующее:

 try
            {
                File.Delete(lowResFilePath);
                File.Delete(hiResFilePath);
            }
            catch (Exception ex0)
            { }

            try
            {
                if (Directory.GetFiles(hiResFilePath.Substring(0, hiResFilePath.LastIndexOf("\\"))).Length <= 0)
                    Directory.Delete(hiResFilePath.Substring(0, hiResFilePath.LastIndexOf("\\")));
            }
            catch (Exception ex0)
            { }

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

                //try
            //{
            //    if (Directory.GetFiles(hiResFilePath.Substring(0, hiResFilePath.LastIndexOf("\\"))).Length <= 0)
            //        Directory.Delete(hiResFilePath.Substring(0, hiResFilePath.LastIndexOf("\\")));
            //}
            //catch (Exception ex0)
            //{ }

Все отлично работает !!

Эти строки просто проверяют папку, в которойПолучен один из только что удаленных файлов.Если эта папка сейчас пуста, я хочу ее удалить.

Опять же, мои извинения за то, что я привел вас хороших людей в мою погоню за диким гусем.Но есть ли у вас идеи, почему это может происходить?Или как я могу успешно удалить каталог, если он пуст, без строки веб-клиента, выдавшей поток исключений ??

Спасибо:)

0 голосов
/ 14 июля 2010

Не видя никакого кода, похоже, что вы неправильно распределяете ресурсы, которые вы создаете / используете в своем веб-сервисе.Таким образом, он работает, затем вылетает (прерывает поток, который удаляет все), затем он снова работает.

РЕДАКТИРОВАТЬ:

Несколько других вещей, чтобы подуматьпосмотри на.1) Я никогда раньше не использовал одностороннее связывание, работает ли это, когда у вас нет этого набора.2) Вы называете это слишком быстро?Это означает, что загрузка / сохранение выполняется к тому времени, когда вы снова вызываете метод?3) В вашем файле web.config установлены ли тайм-ауты и максимальные размеры загрузки, достаточные для загрузки / передачи файлов?

<system.web>
    <httpRuntime executionTimeout="600" maxRequestLength="2048000" />
</system.web>

Это все, что я могу придумать, если это не поможетВозможно, кто-то еще сталкивался с этой проблемой раньше.По словам гугл, ваш про единственный:)

...