Biztalk 动态FTP文件夹管道

Biztalk 动态FTP文件夹管道,biztalk,biztalk-2016,custom-pipeline-component,send-port,Biztalk,Biztalk 2016,Custom Pipeline Component,Send Port,我正在尝试动态设置FTP位置的输出文件夹。 分配,对于每个客户,我需要创建一个单独的文件夹来存储Excel文件和/或XML文件 我试过的 创建了自定义管道组件,以将所有必需的属性设置到FTP发送端口中 尝试将同一管道插入动态发送端口 用于测试,请在编排中尝试代码 我注意到: 当我通过FTP发送端口发送时,这些属性不会被自定义管道属性覆盖 当我通过动态发送时,我总是得到以下错误 传输消息时遇到故障 即使在尝试将属性设置到编排中时,也会出现相同的错误 另外,当我试图通过动态发送端口发送时,我注意

我正在尝试动态设置FTP位置的输出文件夹。 分配,对于每个客户,我需要创建一个单独的文件夹来存储Excel文件和/或XML文件

我试过的

  • 创建了自定义管道组件,以将所有必需的属性设置到FTP发送端口中
  • 尝试将同一管道插入动态发送端口
  • 用于测试,请在编排中尝试代码
我注意到:

当我通过FTP发送端口发送时,这些属性不会被自定义管道属性覆盖

当我通过动态发送时,我总是得到以下错误

传输消息时遇到故障

即使在尝试将属性设置到编排中时,也会出现相同的错误

另外,当我试图通过动态发送端口发送时,我注意到管道组件没有被触动

执行自定义管道组件的代码部分

public IBaseMessage Execute(IPipelineContext pipelineContext, IBaseMessage inputMessage)
    {
        Guid callToken = TraceManager.PipelineComponent.TraceIn(CLASSNAME + ".Execute() - Start", pipelineContext.PipelineID, pipelineContext.PipelineName, pipelineContext.StageID);

        if (!this.Active)
        {
            TraceManager.PipelineComponent.TraceOut(callToken, CLASSNAME + ".Execute() - Pipeline component is not active!");
            return inputMessage;
        }

        try
        {
            string completeFTPUri = null;
            string fileName = null;
            string accountNumber = Convert.ToString(inputMessage.Context.Read(PROP_ACCOUNTNUMBER.Name.Name, PROP_ACCOUNTNUMBER.Name.Namespace));

            if (!string.IsNullOrWhiteSpace(accountNumber))
                this.Folder = string.Format("{0}/{1}", this.Folder, accountNumber);

            if (!string.IsNullOrWhiteSpace(this.Folder))
                completeFTPUri = string.Format("ftp://{0}:21/{1}", this.FTPUri, this.Folder);
            else
                completeFTPUri = this.FTPUri;

            if (!UseDefaultFilename)
            {
                string receiveFilename = null;
                receiveFilename = Convert.ToString(inputMessage.Context.Read(FTP_RECEIVED_FILENAME.Name.Name, FTP_RECEIVED_FILENAME.Name.Namespace));

                if (!string.IsNullOrWhiteSpace(receiveFilename))
                    fileName = Path.GetFileName(receiveFilename);
            }

            if (string.IsNullOrWhiteSpace(fileName))
            {
                if (string.IsNullOrWhiteSpace(this.Filename))
                    fileName = DEFAULT_FILENAME;
                else
                    fileName = this.Filename;
            }

            if (fileName.Contains("{0") || fileName.Contains("{1"))
            {
                fileName = string.Format(fileName, DateTime.Now, inputMessage.MessageID);
            }

            if (!string.IsNullOrWhiteSpace(this.Folder))
            {
                //inputMessage.Context.Write(FTP_BEFORE_PUT.Name.Name, FTP_BEFORE_PUT.Name.Namespace, string.Format("MKDIR {0}", string.Format("ftp://{0}:21/{1}", this.FTPUri, this.Folder)));
                inputMessage.Context.Promote(FTP_BEFORE_PUT.Name.Name, FTP_BEFORE_PUT.Name.Namespace, string.Format("MKDIR {0}", completeFTPUri));
            }

            //inputMessage.Context.Write(OUTBOUND_TRANSPORT_LOCATION.Name.Name, OUTBOUND_TRANSPORT_LOCATION.Name.Namespace, completeFTPUri);
            //inputMessage.Context.Write(FILE_RECEIVED_FILENAME.Name.Name, FILE_RECEIVED_FILENAME.Name.Namespace, fileName);
            //inputMessage.Context.Write(FTP_USERNAME.Name.Name, FTP_USERNAME.Name.Namespace, _userName);
            //inputMessage.Context.Write(FTP_PASSWORD.Name.Name, FTP_PASSWORD.Name.Namespace, _password);
            inputMessage.Context.Promote(OUTBOUND_TRANSPORT_LOCATION.Name.Name, OUTBOUND_TRANSPORT_LOCATION.Name.Namespace, completeFTPUri);
            inputMessage.Context.Promote(OUTBOUND_TRANSPORT_TYPE.Name.Name, OUTBOUND_TRANSPORT_TYPE.Name.Namespace, "FTP");
            inputMessage.Context.Promote(FILE_RECEIVED_FILENAME.Name.Name, FILE_RECEIVED_FILENAME.Name.Namespace, fileName);
            inputMessage.Context.Promote(FTP_USERNAME.Name.Name, FTP_USERNAME.Name.Namespace, this.UserName);
            inputMessage.Context.Promote(FTP_PASSWORD.Name.Name, FTP_PASSWORD.Name.Namespace, this.Password);

        }
        catch (Exception ex)
        {
            TraceManager.PipelineComponent.TraceError(ex, false, callToken);
            throw new Exception(CLASSNAME + ".Execute() - Failed to set the filename.", ex);
        }

        TraceManager.PipelineComponent.TraceOut(callToken, CLASSNAME + ".Execute() - Finished.");
        return inputMessage;
    }
编辑:

在这次尝试了很多之后,我开始更新了。 当我尝试通过静态发送端口动态发送时,我保留了相同的问题。 当我尝试通过动态发送端口动态发送时,我遇到了不同的错误:

内部异常:分配给属性“Microsoft.XLANGs.BaseTypes.Address”的值无效:“FTP URI”

我不知道解决这个问题的最好办法是什么。 我还可以将所有内容写入助手类,并尝试通过C#代码发送。但我想使用BizTalk的力量,并希望能够在必要时启用和禁用端口。这是主要原因。 我不怕编写定制的管道组件或其他东西,所以如果有人能帮忙的话。请

业务流程的消息分配代码

MsgPublishArticleMessage = MsgFullArticleMessage;
MsgPublishArticleMessage(*) = MsgFullArticleMessage(*);

MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.Domain) = "ArticleMessage";
MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.Service) = "PricatService";
MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.Action) = "PublishPricatXLSX";
MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.Version) = "1.0";
MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.AccountNumber) = articleMessageRequest.AccountNumber;
MsgPublishArticleMessage(BTS.OutboundTransportLocation) = "ftp://URI:21/Pricat/" + articleMessageRequest.AccountNumber;
MsgPublishArticleMessage(BTS.OutboundTransportType) = "FTP";
MsgPublishArticleMessage(FTP.Password) = "********";
MsgPublishArticleMessage(FTP.UserName) = "UserName";
MsgPublishArticleMessage(FTP.BeforePut) = "MKDIR " + articleMessageRequest.AccountNumber;
MsgPublishArticleMessage(FTP.ReceivedFileName) = Destil.BizTalk.ArticleMessage.Components.OrchestrationHelper.CreateReceivedFileName(articleMessageRequest, ".xlsx");
PublishArticleMessagePort(Microsoft.XLANGs.BaseTypes.Address) = "FTPURI";
PublishArticleMessagePort(Microsoft.XLANGs.BaseTypes.TransportType) = "FTP";
MsgPublishArticleMessage(BTS.IsDynamicSend) = true;
MsgPublishArticleMessage = MsgFullArticleMessage;
MsgPublishArticleMessage(*) = MsgFullArticleMessage(*);

MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.Domain) = "ArticleMessage";
MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.Service) = "PricatService";
MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.Action) = "PublishPricatXLSX";
MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.Version) = "1.0";
MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.AccountNumber) = articleMessageRequest.AccountNumber;
MsgPublishArticleMessage(BTS.OutboundTransportLocation) = "ftp://URI:21/Pricat/" + articleMessageRequest.AccountNumber;
MsgPublishArticleMessage(BTS.OutboundTransportType) = "FTP";
MsgPublishArticleMessage(FTP.Password) = "*********";
MsgPublishArticleMessage(FTP.UserName) = "username";
MsgPublishArticleMessage(FTP.BeforePut) = "MKD Pricat/" + articleMessageRequest.AccountNumber + "; CWD Pricat/" + articleMessageRequest.AccountNumber;
PublishArticleMessagePort(Microsoft.XLANGs.BaseTypes.Address) = "ftp://URI:21/" + DOMAIN.BizTalk.ArticleMessage.Components.OrchestrationHelper.CreateReceivedFileName(articleMessageRequest, ".xlsx");
PublishArticleMessagePort(Microsoft.XLANGs.BaseTypes.TransportType) = "FTP";
MsgPublishArticleMessage(BTS.IsDynamicSend) = true;
编辑2:

当我将邮件助理更改为以下代码时,我可以将文件发送到动态文件夹。 我现在遇到的唯一问题是: 当文件夹已经存在时,我将失败

有人知道只有当文件夹不存在时,我才需要使用什么FTP命令来创建文件夹吗? 我尝试了以下命令

MDK——p/Pricat/账号
MDK/Pricat/账号
如果不存在“/Pricat/AccountNumber”MDK/Pricat/AccountNumber

已更改业务流程中消息分配的代码

MsgPublishArticleMessage = MsgFullArticleMessage;
MsgPublishArticleMessage(*) = MsgFullArticleMessage(*);

MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.Domain) = "ArticleMessage";
MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.Service) = "PricatService";
MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.Action) = "PublishPricatXLSX";
MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.Version) = "1.0";
MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.AccountNumber) = articleMessageRequest.AccountNumber;
MsgPublishArticleMessage(BTS.OutboundTransportLocation) = "ftp://URI:21/Pricat/" + articleMessageRequest.AccountNumber;
MsgPublishArticleMessage(BTS.OutboundTransportType) = "FTP";
MsgPublishArticleMessage(FTP.Password) = "********";
MsgPublishArticleMessage(FTP.UserName) = "UserName";
MsgPublishArticleMessage(FTP.BeforePut) = "MKDIR " + articleMessageRequest.AccountNumber;
MsgPublishArticleMessage(FTP.ReceivedFileName) = Destil.BizTalk.ArticleMessage.Components.OrchestrationHelper.CreateReceivedFileName(articleMessageRequest, ".xlsx");
PublishArticleMessagePort(Microsoft.XLANGs.BaseTypes.Address) = "FTPURI";
PublishArticleMessagePort(Microsoft.XLANGs.BaseTypes.TransportType) = "FTP";
MsgPublishArticleMessage(BTS.IsDynamicSend) = true;
MsgPublishArticleMessage = MsgFullArticleMessage;
MsgPublishArticleMessage(*) = MsgFullArticleMessage(*);

MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.Domain) = "ArticleMessage";
MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.Service) = "PricatService";
MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.Action) = "PublishPricatXLSX";
MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.Version) = "1.0";
MsgPublishArticleMessage(DOMAIN.BizTalk.Common.Schemas.AccountNumber) = articleMessageRequest.AccountNumber;
MsgPublishArticleMessage(BTS.OutboundTransportLocation) = "ftp://URI:21/Pricat/" + articleMessageRequest.AccountNumber;
MsgPublishArticleMessage(BTS.OutboundTransportType) = "FTP";
MsgPublishArticleMessage(FTP.Password) = "*********";
MsgPublishArticleMessage(FTP.UserName) = "username";
MsgPublishArticleMessage(FTP.BeforePut) = "MKD Pricat/" + articleMessageRequest.AccountNumber + "; CWD Pricat/" + articleMessageRequest.AccountNumber;
PublishArticleMessagePort(Microsoft.XLANGs.BaseTypes.Address) = "ftp://URI:21/" + DOMAIN.BizTalk.ArticleMessage.Components.OrchestrationHelper.CreateReceivedFileName(articleMessageRequest, ".xlsx");
PublishArticleMessagePort(Microsoft.XLANGs.BaseTypes.TransportType) = "FTP";
MsgPublishArticleMessage(BTS.IsDynamicSend) = true;

当覆盖静态发送端口属性时,您必须让适配器知道它应该使用消息属性而不是端口属性

将IsDynamicSend属性设置为true

inmsg.Context.Promote("IsDynamicSend", "http://schemas.microsoft.com/BizTalk/2003/system-properties", true);

从您提供的代码片段中,可以检查以下行

PublishArticleMessagePort(Microsoft.XLANGs.BaseTypes.Address) = "FTPURI";
您已将FTPURI声明为变量,并为地址分配了一个常量字符串。这也许可以解释这个错误-

内部异常:分配给属性“Microsoft.XLANGs.BaseTypes.Address”的值无效:“FTP URI”


当您在编排中执行此操作时,是否将其与动态发送端口一起使用?您可以共享您在编排中使用的代码吗?请同时查看此问题错误消息是否还有其他内容?是否在管道执行时尝试调试管道?它在哪里失败了?@Dijkgraaf当我调试我的管道组件时,组件中没有任何错误。我还将文件发送到FTP位置的根文件夹。现在,我正在尝试通过编排使功能正常工作。我会让你不断更新!更新的问题和我所尝试的到目前为止第二次更新我遇到了一个问题,只有创建文件夹,如果不存在我已经把FTP服务器的IP地址放在那里。并收到该错误,因为我不想在我更改的帖子中设置我的IPFTPURI@SjoerdAlaerdsIP地址前是否有
ftp://
?正如错误所说,它需要是一个完整的URI。