我做了一个批处理类来检查FTP中的文件,下载它们并在FTP上删除它们。
当我手动运行它(不是批处理)时,它工作得很好,可以下载FTP中的所有文件,并在下载完成时删除它们。
当我尝试批量运行时,问题开始了,我尝试了服务器端和客户端的批处理。
它们都会给出一个超时错误:
System.Reflection.TargetInvocationException:调用的目标引发了异常。-> System.Net.WebException:操作超时。
在System.Net.FtpWebRequest.CheckError()
在System.Net.FtpWebRequest.GetResponse()
-内部异常堆栈跟踪结束
有没有人有从FTP批量下载文件的经验?
我已尝试将超时时间设置得更高。我还在执行批处理作业的服务器上测试了连接,我可以访问FTP。所以这不是防火墙的问题。我想它一定是AX内部的什么东西,但我真的想不出任何东西。
这是代码(注意:下载文件和删除文件是使用不同的set_method()进行连接的相同代码:
permissionSet = new Set(Types::Class);
files = new List(types::String);
permissionset.add(new InteropPermission(InteropKind::DllInterop));
permissionset.add(new InteropPermission(InteropKind::ClrInterop));
CodeAccessPermission::assertMultiple(permissionset);
ftpo = System.Net.WebRequest::Create(<ftp link>);
request = ftpo;
request.set_KeepAlive(false);
request.set_UsePassive(false);
request.set_UseBinary(true);
request.set_Method("NLST");
credential = new System.Net.NetworkCredential(<user>,<pw>);
request.set_Credentials(credential);
try
{
//first get the filelist from FTP
response = request.GetResponse();
reader = new System.IO.StreamReader(response.GetResponseStream());
while(!reader.get_EndOfStream())
{
text = reader.ReadLine();
files.addStart(text);
}
reader.Close();
response.Close();
CodeAccessPermission::revertAssert();
if(files.elements() >0)
{
it = New ListIterator(files);
while(it.more())
{
filename = it.value();
downloadfile(filename);
deleteFile(filename);
it.next();
}
}
}
这是完整的例外:
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Net.WebException: The operation has timed out.
at System.Net.FtpWebRequest.CheckError()
at System.Net.FtpWebRequest.GetResponse()
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at ClrBridgeImpl.InvokeClrInstanceMethod(ClrBridgeImpl* , ObjectWrapper* objectWrapper, Char* pszMethodName, Int32 argsLength, ObjectWrapper** arguments, Boolean* argsAreByRef, Boolean* isException)
发布于 2013-05-23 16:17:48
在我的经验中,文件操作在批量运行时是不可靠的。如果您尝试在客户端运行它,但它仍然超时,那么您可能会遇到另一个问题。根据我的经验,您可能需要打开FTP服务器的属性(很可能是在IIS中),并增加超时限制。我不得不对我们用来产生销售税的web服务做一些类似的事情。如果我们有一个超过100行的销售订单,它将生成相同的错误。当我们增加超时时,错误就消失了。
https://stackoverflow.com/questions/16147752
复制