我正在研究使用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;
}
}
答案 0 :(得分:0)
不幸的是,开箱即用的STA无法将提供商的Context值传递给Message。
但是,您可以通过修改(非)TransactionalTasks和您的提供程序来修改适配器,以返回包含流和属性包的Object。
然后将属性写入创建的消息。