【问题标题】:MS Azure - C# WebJob Project DependencyMS Azure - C# WebJob 项目依赖
【发布时间】:2015-12-07 20:18:30
【问题描述】:

我是 Azure WJ 的新手。 我在一个解决方案中有 2 个项目:实际的网站 - 项目 2WebJob - 项目 1。 WJ 的唯一任务是在预定时间内从 project 2 的公共类中调用公开的方法。

创建 WJ 时,项目 2 - 网站 的类和方法被添加为 解决方案参考项目 1 - WebJob 使它们易于访问。

我遇到的问题是:

构建 WebJob 时,它会在给定时间编译所有依赖项。当最终的 .zip 上传到 Azure WebJob 门户时,Webjob 将使用已编译的代码版本执行。这意味着在使用更新的 Project 2 - website 依赖项和 .zip 重新构建 WJ 之前,对 Project 2 - website 的任何新更改都不会生效已上传。

有没有办法创建 WJ(作为项目 1),只要调用的方法是在场吗?

例子:

WebJob 代码(项目 1):

namespace SecondProject
{
    class Program
    {
        static void Main()
        {
            var client = new WebClient();
            secondProjectMethod();
        }
    }
}

网站代码(项目 2):

namespace firstProject
{
    public class someClass
    {
        public void secondProjectMethod()
        {
            // I want to make any code changes I want inside this 
            // method anytime and the WbJob should not care
            // about these changes as long as this method name exist.
            // Because all it should care about is that it should
            // call this  method name.
        }
    }
}

【问题讨论】:

  • 由于您使用的是网站,因此您可以将 Proj2 中的方法公开为 API,并让 WebJob 以您计划的时间间隔调用 API(而不是方法)。所以即使你在Proj2中改变了方法,只要暴露的API调用更新的方法,WebJob就会独立。
  • 是的,这似乎是最合乎逻辑的解决方案。我希望有更多可用的 API 代码示例。谢谢。

标签: c# azure-web-app-service azure-webjobs webjob


【解决方案1】:

由于您使用的是网站,因此您可以将 Proj2 中的方法公开为 API,并让 WebJob 以您计划的时间间隔调用 API(而不是方法)。所以即使你在 Proj2 中改变方法,只要暴露的 API 调用更新的方法,WebJob 就会独立。
你可以看看这个link,用于创建基本 API

【讨论】:

  • 感谢这个链接,这正是我所追求的。
【解决方案2】:

我想到了至少两个选项:

选项1:您的WJ项目不直接引用您的网站项目,而是在运行时使用反射加载网站dll。并使用反射来调用你想调用的函数(假设签名永远不会改变)

这种方法的挑战是您的 WJ 需要以某种方式找出网站 dll 的路径。

选项2:既然是网站,为什么不把你想调用的函数暴露为REST API,这样你的WJ只需要进行一个http调用

【讨论】:

  • ..是的,这就是我最终做的事情,但是我并不喜欢在应用程序中使用 HTTP 调用,因为它应该能够在内部调用这些方法。不是说不能,但需要的不仅仅是一行代码。
  • @Milan 如果您仍想在内部调用该方法,可能在旁边运行另一个 webjob,并观察文件系统,如果文件更改将 dll 从您的网站项目复制到您的 webjob 项目. (但无论您采用哪种方式,它都不会只是一行代码。)我会建议使用 HTTP 请求方法,因为它更简单,唯一的问题是 REST API 可能会被外部用户发现。为了安全起见,您可能需要做一些额外的检查以确保它是从同一台机器调用的(如果这是一个问题)
【解决方案3】:

这个问题似乎不是特定于 Web 作业的问题,但无论如何......

如果您需要两个项目独立,那么您不应该使用项目引用。

我建议将 Project2 共享类/方法发布为 nuget 包并改用 nuget,因此对 Project2 的任何更改都不会影响您的 WebJob,直到您发布新的 nuget 包并使用您的网络作业。

或者,您可以为您的 dll 创建一个文件夹,例如“共享库”,并从该位置引用 Project2 而不是项目,以将您的 Web 作业的更改与您的项目引用隔离开来。..

【讨论】:

  • ..好的,我明白了。因此,当您说“问题似乎不是特定于 Web 作业的..”时,您的意思是这适用于任何项目间依赖关系?如果是这样,那么我应该澄清我想要完成的只是通过 Azure WebJob 创建一个简单、可靠的“计划任务”。如果您在专用服务器上工作并且有可用的“计划任务”,那么您不会三思而后行。
  • 对,我猜,如果你的逻辑足够简单,也许你可以复制代码,让网络作业有它自己的代码版本...
  • 我的意思是,为了创建一个简单的计划作业,这似乎需要跳过很多圈子。没有简单的解决方案吗?
  • ... 是的,这就是我遇到这个问题的地方,因为该网站是一个相当大的项目,并且一直在进行更改。
  • 根据工作的不同,您可以使用不同的东西,例如 Azure 调度程序:azure.microsoft.com/en-us/documentation/articles/… 甚至可能是 Azure 自动化 ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 2016-11-26
  • 2022-09-28
  • 1970-01-01
  • 2021-11-05
  • 2013-01-30
相关资源
最近更新 更多