【问题标题】:.Net Application as Azure Web Job not writing on disk.Net 应用程序作为 Azure Web 作业未写入磁盘
【发布时间】:2019-08-03 07:00:01
【问题描述】:

我有一个带有 x86 构建平台的 .net core 2.2 控制台应用程序,它只调用一个非托管 dll,该 dll 返回结果的布尔值,并且该 dll 还在磁盘上写入一个名为“OMNISCHEDULERLIB.LOG”的 txt 文件,同时在本地调试我可以运行它并且函数正确执行并在控制台上打印出 dll 的结果布尔值。

class Program
{
    static void Main(string[] args)
    {
        try
        {
            var result = ProcessJobs();
            Console.WriteLine(result);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message + e.StackTrace);
        }
    }

    [DllImport("Output/OmniSchedulerLIB.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "ProcessJobs")]
    private static extern bool ProcessJobs();
}

这是我的 Program.cs 文件的代码,它在本地正确调用 dll 并在文件夹输出中生成“OMNISCHEDULERLIB.LOG”。 当我将它部署为 azure 作为 AppService 的 WebJob 时,webjob 会在控制台上正确打印出结果,但在输出文件夹下没有创建日志文件(我已经通过 ftp 和 Kudu 工具进行了检查)。 我不明白的是,如果我继续使用 Kudu 工具和 webjob 目录并通过 cmd 'start myapp.exe' 运行控制台应用程序的 .exe,我会在控制台上得到结果并创建 .log 文件在我的网络作业的输出文件夹下。

我的问题是 azure webjob 运行什么命令来执行我的 .net 核心控制台,它是如何防止写入磁盘的,或者对这种情况有任何其他解释?

编辑:进入 D:\home\data\logs\ 后,我能够找到正在运行的脚本

[03/13/2019 10:05:00 > a87042: SYS INFO] Status changed to Initializing
[03/13/2019 10:05:05 > a87042: SYS INFO] Run script 'OmniManager.OmniSchedulerWebJob.exe' with script host - 'WindowsScriptHost'
[03/13/2019 10:05:05 > a87042: SYS INFO] Status changed to Running
[03/13/2019 10:05:10 > a87042: INFO] True
[03/13/2019 10:05:10 > a87042: SYS INFO] Status changed to Success

但是那里没有生成 .log 文件,但是如果我从 kudu 的 cmd 'start OmniManager.OmniSchedulerWebJob.exe' 手动运行命令,它将返回与上述相同的结果 'True' 但生成了 .log 文件.我尝试添加 run.cmd 来运行我的 dotnet 控制台应用程序 dll 但没有成功,但似乎我收到了一个错误,因为我无法从 x86 平台运行它,而且我还没有找到运行“dotnet”的方法选择 .net 的 x86 sdk 时执行命令,但我的 exe 将以 32 位执行。

【问题讨论】:

  • 你能试着在这行之后写文件登录吗 var result = ProcessJobs();看看它是否有效并创建新文件?此外,您实际上可以在 KUDU 中看到相同的日志,您将能够看到它实际执行的命令和 exe。你能试试看它是否提供了一些有用的信息。
  • 我已经根据您的 aswner 和 @joey-cai 的意见编辑了我的问题
  • 请参考 Joey cai 发布的答案,看看是否有帮助。我的下一点是相同的使用路径 data\logs\OMNISCHEDULERLIB.log 而不是直接添加日志文件名输出。
  • 问题是我正在调用一个没有源代码的dll,我也无法选择它默认写入的位置,它将写入输出文件夹,通过运行exe可以正确执行Kudu 上的 cmd 命令,但是当 webjob 按计划或手动运行时,它不会生成该文件

标签: c# azure .net-core azure-webjobs


【解决方案1】:

您可以使用dotnet consolecorewebjob.dll 来运行控制台核心应用程序。更多详情可以参考How to deploy a .NET Core console application to Azure, WebJob的文章。

您可以尝试查看D:\home\data\logs\OMNISCHEDULERLIB.log下的日志。

【讨论】:

  • 将 dotnet 命令直接运行到我的 dll 将重现以下错误“外部组件已引发异常”我认为我不能在 sdk x64 中使用 x86 平台 dll,而我不能在 dotnet -h 中找到一个选项来选择 x86 sdk 版本
  • 你可以参考这个link,它会自动为项目选择正确的sdk版本。
  • 或者你可以去OmniSchedulerLIB项目然后点击properties> build>platform target到x64
  • 是的,该链接是我最初能够以 32 位调试我的应用程序并调用 dll 它不能解决我的问题,因为我的应用程序工作简单,dll 无法写入在磁盘上,我无法编译 64 位的 dll,因为我不负责或访问的源代码。
【解决方案2】:

显然,由于我能够通过 kudu powershell 工具运行 .net 核心应用程序的 .exe(我发布为自包含以作为 x86 工作)来获得预期的输出 .log 文件,因此解决方法是添加运行。使用命令'cmd /c myapplication.exe' 将 cmd 文件添加到 webjob 中,这样它将是 dll 操作返回的布尔值的结果,并允许 dll 写入 webjob 目录。 所有答案都不足以达到我的解决方案,因为它们提供了有用的链接,我在提出这个问题之前已经越过这些链接,但我感谢所有的意见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多