接收 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)TransactionalTask​​s 和您的提供程序修改为 return 包含流和 属性 包的对象来修改适配器以执行此操作。

然后将属性写入创建的消息。