0

我的 C# .NET Web 应用程序中有一个简单的单向 Web 服务。我需要从给定的 URL 下载图像并将其保存到我的服务器。

但是,每次我调用该服务时,它都能完美运行。其他时候,我在 webClient.DownloadFile 行上收到“线程被中止”异常。

我读过 WebClient 使用需要访问 HttpContext.Current 的 httpWebRequest。这是真的?如果是这样,为什么它可以每隔一段时间访问它?

我尝试在通话之前添加以下几行:

WebService 服务 = 新的 WebService();
HttpContext.Current = service.Context;

但这并没有什么不同。

我运行了 10 次服务,结果如下:

1:成功

2:异常:线程被中止。堆栈跟踪:在 System.Net.WebClient.DownloadBitsState.RetrieveBytes(Int32& bytesRetrieved) 在 System.Net.WebClient.DownloadBits(WebRequest request, Stream System.Net.WebClient.DownloadFile(Uri 地址,字符串文件名)处的 writeStream、CompletionDelegate、completionDelegate、AsyncOperation asyncOp)...

3:成功

4:异常:线程被中止。堆栈跟踪:在 System.Net.WebClient.DownloadBitsState.RetrieveBytes(Int32& bytesRetrieved) 在 System.Net.WebClient.DownloadBits(WebRequest request, Stream System.Net.WebClient.DownloadFile(Uri 地址,字符串文件名)处的 writeStream、CompletionDelegate、completionDelegate、AsyncOperation asyncOp)...

5:成功

6:异常:线程被中止。堆栈跟踪:在 System.Net.WebClient.DownloadBits(WebRequest 请求,流 writeStream,CompletionDelegate completionDelegate,AsyncOperation asyncOp)的 System.Net.WebClient.DownloadBitsState.SetResponse(WebResponse 响应)处 System.Net.WebClient.DownloadFile(Uri 地址,字符串文件名) ...

7:成功

8:异常:线程被中止。堆栈跟踪:在 System.Net.WebClient.DownloadBits(WebRequest 请求,流 writeStream,CompletionDelegate completionDelegate,AsyncOperation asyncOp)的 System.Net.WebClient.DownloadBitsState.SetResponse(WebResponse 响应)处 System.Net.WebClient.DownloadFile(Uri 地址,字符串文件名) ...

9:成功

10:异常:线程被中止。堆栈跟踪:在 System.Net.WebClient.DownloadBits(WebRequest 请求,流 writeStream,CompletionDelegate completionDelegate,AsyncOperation asyncOp)的 System.Net.WebClient.DownloadBitsState.SetResponse(WebResponse 响应)处 System.Net.WebClient.DownloadFile(Uri 地址,字符串文件名)...

有什么办法可以使这项工作?

编辑:回答有关发布代码的问题:没有太多要发布的。这一切都很简单。

[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
           }
    }
}
4

2 回答 2

0

好的,事情发生了巨大的转变,我很抱歉在发布之前没有像我应该做的那样彻底研究(尽管我已经为此工作了两天......)那个 httpContext 事情是一场漫长的疯狂追逐:(

我上面发布的代码是我真正使用的代码的简化版本(愚蠢,我知道,我很抱歉)。但它促使我尝试那个有效的简化版本!

我现在的问题是:

我有一个包含我自己(不是 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)
            //{ }

一切正常!!

这些行只是检查包含刚刚删除的文件之一的文件夹。如果那个文件夹现在是空的,我想删除它。

再次,我很抱歉带领你们好人进行我自己的野鹅追逐。但是您知道为什么会发生这种情况吗?或者如果没有webclient行抛出threadabortexception,我如何能成功删除目录?

谢谢 :)

于 2010-07-14T14:04:31.230 回答
0

没有看到任何代码,听起来您没有正确处理您在 Web 服务中创建/使用的资源。因此,它工作,然后崩溃(中止处理所有内容的线程),然后再次工作。

编辑:

其他一些需要考虑/看看的事情。1)我以前从未使用过单向绑定,当您没有该设置时,这是否有效。2)你调用这些太快了吗?意思是,它是在您再次调用该方法时完成的下载/保存?3) 在您的 web.config 中,您的超时和最大下载大小是否设置得足够大以允许您下载/传输文件?

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

这就是我能想到的全部,如果它没有帮助,也许其他人之前遇到过这个问题。根据谷歌的说法,你只有一个:)

于 2010-07-14T12:53:54.517 回答