接收 Ftp 下载流时设置上下文属性
Set Context propeties when receive FtpDownload stream
我正在研究使用 taskscheduler 适配器在 BizTalk 中创建计划任务的解决方案。
使用 C# 组件,我创建了 FTP 下载函数 returns 一个流。
我现在 运行 遇到以下问题。
我需要获取文件名作为流上的标记,以便我可以在另一个解决方案中读取它以获得正确的输出文件名。
对于读出文件名的解决方案,我使用了 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;
}
}
不幸的是,开箱即用的 STA 无法将上下文值从提供者传递到消息。
但是,您可以通过将 (Non)TransactionalTasks 和您的提供程序修改为 return 包含流和 属性 包的对象来修改适配器以执行此操作。
然后将属性写入创建的消息。
我正在研究使用 taskscheduler 适配器在 BizTalk 中创建计划任务的解决方案。 使用 C# 组件,我创建了 FTP 下载函数 returns 一个流。
我现在 运行 遇到以下问题。 我需要获取文件名作为流上的标记,以便我可以在另一个解决方案中读取它以获得正确的输出文件名。
对于读出文件名的解决方案,我使用了 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;
}
}
不幸的是,开箱即用的 STA 无法将上下文值从提供者传递到消息。
但是,您可以通过将 (Non)TransactionalTasks 和您的提供程序修改为 return 包含流和 属性 包的对象来修改适配器以执行此操作。
然后将属性写入创建的消息。