.NET-使用WebClient.Download文件以单向WebService

.NET-使用WebClient.Download文件以单向WebService,.net,web-services,webclient,httpcontext,threadabortexception,.net,Web Services,Webclient,Httpcontext,Threadabortexception,我的C.NETWeb应用程序中有一个简单的单向web服务。我需要从给定的URL下载图像并将其保存到我的服务器 但是,每次我打电话给该服务时,它都能正常工作。在我获取线程的其他时间,webClient.DownloadFile行出现异常中止 我已经读到WebClient使用httpWebRequest,它需要访问HttpContext.Current。这是真的吗?如果是这样,为什么它可以每隔一次访问它 我已尝试在通话前添加以下行: WebService服务=新的WebService; HttpCo

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

但是,每次我打电话给该服务时,它都能正常工作。在我获取线程的其他时间,webClient.DownloadFile行出现异常中止

我已经读到WebClient使用httpWebRequest,它需要访问HttpContext.Current。这是真的吗?如果是这样,为什么它可以每隔一次访问它

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

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

但这没什么区别

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

1:成功

2:异常:正在中止线程。 堆栈跟踪:位于System.Net.ConnectStream.ReadByte[]缓冲区,Int32偏移量,Int32大小位于System.Net.WebClient.DownloadBitsState.RetrieveBytesInt32,bytesRetrieved位于System.Net.WebClient.DownloadBitsWebRequest请求,Stream writeStream,CompletionDelegate CompletionDelegate,异步操作异步操作位于System.Net.WebClient.DownloadFileUri地址,字符串文件名

3:成功

4:异常:正在中止线程。 堆栈跟踪:位于System.Net.ConnectStream.ReadByte[]缓冲区,Int32偏移量,Int32大小位于System.Net.WebClient.DownloadBitsState.RetrieveBytesInt32,bytesRetrieved位于System.Net.WebClient.DownloadBitsWebRequest请求,Stream writeStream,CompletionDelegate CompletionDelegate,异步操作异步操作位于System.Net.WebClient.DownloadFileUri地址,字符串文件名

5:成功

6:异常:正在中止线程。 堆栈跟踪:在System.Net.WebClient.DownloadBitsState.SetResponseWebResponse在System.Net.WebClient.DownloadBitsWebRequest请求中响应,流写入流,CompletionDelegate CompletionDelegate,异步操作异步操作在System.Net.WebClient.DownloadFileUri地址,字符串文件名

7:成功

8:异常:正在中止线程。 堆栈跟踪:在System.Net.WebClient.DownloadBitsState.SetResponseWebResponse在System.Net.WebClient.DownloadBitsWebRequest请求中响应,流写入流,CompletionDelegate CompletionDelegate,异步操作异步操作在System.Net.WebClient.DownloadFileUri地址,字符串文件名

9:成功

10:异常:正在中止线程。 堆栈跟踪:在System.Net.WebClient.DownloadBitsState.SetResponseWebResponse在System.Net.WebClient.DownloadBitsWebRequest请求中响应,流写入流,CompletionDelegate CompletionDelegate,异步操作异步操作在System.Net.WebClient.DownloadFileUri地址,字符串文件名

有什么办法可以让这一切顺利吗

编辑:在回答关于发布代码的问题时:没有太多可发布的内容。一切都很简单

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

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

编辑:

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

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

这就是我所能想到的,如果没有帮助的话,也许以前有人遇到过这个问题。根据谷歌的说法,你的文章是关于唯一的一篇:

好吧,事情发生了巨大的变化,我很抱歉在发布之前没有进行彻底的研究,尽管我已经为此工作了两天。。。httpContext事件是一场漫长的白费力气的追逐:

我上面发布的代码是我正在使用的dumb的简化版本,我知道,我很抱歉。但它促使我尝试那个简单的版本,它可以工作

我现在的问题是:

我有一个对象,其中包含我自己的非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,如何成功删除该目录

Tha
nks:

FYI-我没有使用响应。重定向或响应。在我的应用程序中的任何位置结束。WebClient对象本身是否调用响应。结束??请尝试将其包装在USING语句中。感谢您的响应。我现在已经发布了代码。我还应该做些什么来把事情包在里面呢???这是在它自己的线程还是回调中发生的?如果没有整个背景,很难猜测发生了什么。错误发生在哪一行?