接收FtpDownload流

时间:2017-12-05 15:28:21

标签: c# ftp stream biztalk ftpwebrequest

我正在研究使用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;
        }
    }

1 个答案:

答案 0 :(得分:0)

不幸的是,开箱即用的STA无法将提供商的Context值传递给Message。

但是,您可以通过修改(非)TransactionalTask​​s和您的提供程序来修改适配器,以返回包含流和属性包的Object。

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