【发布时间】:2017-12-05 15:28:21
【问题描述】:
我正在研究一种使用 taskscheduler 适配器在 BizTalk 中创建计划任务的解决方案。 使用 C# 组件,我创建了返回流的 FTPDownload 函数。
我现在遇到了以下问题。 我需要将文件名作为流上的标记,所以我可以在另一个解决方案中读取它以获得正确的输出文件名。
对于读取文件名的解决方案,我使用了 BizTalk 消息的上下文属性,如果我可以在将 FTP 读取到流中时将文件名设置回上下文属性,那就太好了。
public class FTPReceive : IScheduledTaskStreamProvider
{
private readonly string TASK_COMPONENT_NAME = "ScheduledTask FTPReceive";
public Type GetParameterType()
{
return typeof(FTPReceiveArguments);
}
public Stream GetStream(object args)
{
int retryCounter = 1;
bool isDownloaded = false;
Stream responseStream = null;
FTPReceiveArguments parameter = (FTPReceiveArguments) args;
if (string.IsNullOrWhiteSpace(parameter.Url))
{
throw new ArgumentNullException(TASK_COMPONENT_NAME, "URL is null or Empty");
}
while (!isDownloaded && retryCounter <= parameter.RetryCount)
{
try
{
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(@parameter.Url);
ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
ftpRequest.Credentials = new NetworkCredential(parameter.Username, parameter.Password);
FtpWebResponse ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
ftpResponse.Headers.Add("Content-disposition", "inline; filename=fileName.ext");
//ftpResponse.Headers.Add("fileNameTest.xml");
responseStream = ftpResponse.GetResponseStream();
//responseStream.
isDownloaded = true;
}
catch (WebException wex)
{
if ((retryCounter +1) <= parameter.RetryCount)
{
Thread.Sleep(parameter.RetryInterval * 60000);
}
else
{
// Only Log Information to prevent the adapter will be disabled!
}
retryCounter++;
}
catch (Exception ex)
{
// Do nothing, otherwise the adapter will be disabled!
}
}
if (isDownloaded && responseStream != null)
{
return responseStream;
}
return null;
}
}
【问题讨论】:
标签: c# ftp stream biztalk ftpwebrequest