【问题标题】:Azure Logic App, Cant get data from CreateFile FunctionAzure Logic App,无法从 CreateFile 函数获取数据
【发布时间】:2020-11-24 17:20:46
【问题描述】:

所以我注意到了一个奇怪的行为,我想分享一下,看看是否有人遇到过类似的问题。 我们正在使用 Prem 解决方案,在该解决方案中我们拾取文件或 http 事件请求,将其映射到传出的 xml xsd/schema,然后稍后在 prem 上创建文件。

问题是我们保存文件的系统与逻辑应用的配合不太好,逻辑应用有时会失败,因为系统在逻辑应用完成写入完整内容之前获取了文件。 接收文件的系统只读取 .xml 文件,所以我们应该先将文件重命名为 tmp,让逻辑应用程序创建文件,然后重命名它们。 在我们开始将它实际应用到逻辑应用之前,这个解决方案听起来很简单。

如果我们使用具有重命名文件功能的 FileSystem 功能,并使用在 prem 上创建文件中的参数“Name”

{
  "statusCode": 404,
  "message": "Resource not found"
}

我们收到消息 404 说找不到资源,现在这使很多事情变得复杂,我已经检查了帐户的权限,这应该不是问题。 我们还尝试过列出文件夹中的所有文件,创建一个 foreach,然后添加一个规则和重命名文件功能。这使它可以工作,但是逻辑应用程序不能很好地处理使用该解决方案接收大量文件。 但是重命名文件在 foreach 循环中有效,我们从根文件夹或普通文件夹中提取列表中的文件名。

但是为什么它不能只使用重命名功能呢?这可能是逻辑应用重命名文件功能中的天蓝色功能错误吗?

【问题讨论】:

  • 您不应该使用“创建文件”操作中的参数“名称”,您需要通过单击“创建文件”操作右侧的文件夹图标来选择一个文件,然后它会重命名成功。
  • 由于这个过程中有很多文件在运行,我不能只标记一个文件并更改它的名称。它需要是动态过程

标签: azure file filesystems


【解决方案1】:

因此,在与 Microsoft 支持 Azure 讨论后,他们实际上已确认“创建文件”功能存在错误。 看起来所有数据和信息在该功能期间实际上都丢失了,支持技术人员不知道为什么会发生这种情况,但他们有类似的案例,人们已经报告了这些案例。 我没有偶然发现任何这些帖子,但我将发布我们如何通过变通解决问题。 仅供参考,支持团队已进一步处理此案,以便 azure 的开发人员应该调查它,因为它不仅仅是从创建文件中丢失的“名称”标签,(实际上所有有价值的选项都丢失了)。

所以我们首先初始化一个变量,然后在创建文件之前用两步实际设置变量名:

名称由临时名称和 GUID 设置。

下一步是使用函数“Set Variable Temp FileName”中使用的临时名称创建文件

在重命名文件功能上,我们使用存储临时文件的路径并添加“文件名”

并添加我们要使用的“新名称”。

这被证明是可行的,但这是一种解决方法,支持人员确认您应该能够在使用临时名称创建文件并将其更改为所需名称后使用“RenameFile”。 但是由于 Create a File 根本不发送或传递此列表中的任何信息,我们必须初始化变量以使其工作。

如果有人偶然发现后端系统在逻辑应用程序创建文件之前读取文件的相同问题,那么您需要一些解决方法,这对我很有用。 希望对您有所帮助!

【讨论】:

  • 感谢分享。我们刚刚遇到了同样的问题;只有我们也可以通过文件重命名来获得它。似乎本地网关写入文件然后释放锁,然后再次尝试访问文件以确认它已成功写入;但是因为它释放了锁,所以文件在这些事件之间被拦截。这发生在写入和重命名事件上。
【解决方案2】:

我们最近遇到了同样的问题;并且重命名文件的解决方法也失败了。 原因似乎是 Azure On Prem 网关创建一个文件(或重命名一个文件),然后释放其锁定,然后再检查文件是否存在。在释放锁和检查文件是否存在之间的间隙,文件可能会被拾取(删除),从而导致 LogicApps 认为该步骤失败(报告 404 错误),从而造成混乱。

我们的解决方法是创建一个我们在文件服务器上托管的 Windows 服务(这样他们就能够在网络上的任何其他事情之前响应文件更改)。该服务有一个接受路径列表和文件过滤器的配置文件,它使用 FileSystemWatcher 来监视新文件或重命名文件。当它检测到匹配时,它会在文件上取出一个读锁。这确保它不会被任何写入文件的内容阻塞(即,它不必等待 On Prem 网关的写入动作完成才能获得自己的锁),但是当我们的服务持有它的锁时,文件不能已删除(因此消费者无法删除文件/购买时间以供 On Prem 网关执行其写入后读取并报告成功)。我们的服务在定义的时间段后释放它自己的锁(我们已经用了 30 秒,尽管你可能会用更少的时间逃脱)。此时,消费者可以成功消费该文件。

文件监视和锁定逻辑的基本代码如下:

sing System;
using System.IO;
using System.Diagnostics;
using System.Threading.Tasks;

namespace AzureFileGatewayHelper
{
    public class Interceptor: IDisposable
    {
        object lockable = new object();
        bool disposed = false;
        readonly FileSystemWatcher watcher;
        readonly int lockTimeInMS;
        public Interceptor(string path, string filter, int lockTimeInSeconds)
        {
            lockTimeInMS = lockTimeInSeconds * 1000;
            watcher = new FileSystemWatcher();
            watcher.Path = path;
            watcher.Filter = filter;
            watcher.NotifyFilter = NotifyFilters.LastAccess
                                |  NotifyFilters.LastWrite
                                |  NotifyFilters.FileName
                                |  NotifyFilters.DirectoryName;
            watcher.Created += OnIncercept;
            watcher.Renamed += OnIncercept; 
        }
        public Interceptor(InterceptorConfigElement config) : this(config.Path, config.Filter, config.TimeToLockInSeconds) { Debug.WriteLine($"Loaded config ${config.Key}: Path: '${config.Path}'; Filter: '${config.Filter}'; LockTime: : '${config.TimeToLockInSeconds}'."); }

        public void Start() 
        {
            watcher.EnableRaisingEvents = true;
        }
        public void Stop()
        {
            if (watcher != null)
                watcher.EnableRaisingEvents = false;
        }
        private async void OnIncercept(object source, FileSystemEventArgs e)
        {
            using (var fs = new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                Debug.WriteLine($"Locked: {e.FullPath} {e.ChangeType}");
                await Task.Delay(lockTimeInMS); 
            }
            Debug.WriteLine($"Unlocked {e.FullPath} {e.ChangeType}");
        }

        public void Dispose()
        {
            if (disposed) return;
            lock (lockable)
            {
                if (disposed) return;
                Stop();
                watcher?.Dispose();
                disposed = true;
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多