.NET-使用WebClient.Download文件以单向WebService
我的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地址,字符串文件名 有什么办法可以让这一切顺利吗 编辑:在回答关于发布代码的问题时:没有太多可发布的内容。一切都很简单.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
[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语句中。感谢您的响应。我现在已经发布了代码。我还应该做些什么来把事情包在里面呢???这是在它自己的线程还是回调中发生的?如果没有整个背景,很难猜测发生了什么。错误发生在哪一行?