如何从服务器上的客户端作业获取访问权限以进一步处理?

问题描述 投票:0回答:1

首先,我不确定我对 Hangfire 的理解是否正确。我的理解是,从客户端将一些东西放入Hangfire DB中,同时服务器正在运行和监控。当有东西从客户端传入(-->hangfire 数据库中的条目)时,我们会这样做 - 这就是我的问题出现的地方 - 在服务器端执行一些逻辑。

所以我在控制台应用程序的客户端有一份工作:

var jobId = BackgroundJob.Enqueue("download-model", () => CreateModel(new DataModel()));

//..
//..

public static string CreateModel(DataModel model)
{
    model.Application = "FileApp";
    model.Filename = "TestFileName.pdf";
    model.Weburi = @"https://example.com/";
    model.RegId = "abcd";
    return JsonConvert.SerializeObject(model);
}

当我运行程序时,它进入队列`ID:51状态:排队作业:Program.CreateModel。

我想要实现的是,服务器被触发并使用 CreateModel 中的数据来下载文件。这样服务器就会在 Hangfire 数据库中查找:哦,CreateModel 在数据库中,拿它并在服务器端执行一些逻辑,例如使用给定的参数调用 ModelFileDownload。

我不知道如何实现这一目标。我从hangfire服务器仪表板得到的唯一信息是:

Job done.

//Job ID: #50
Program.CreateModel(FromJson<DataModel>("{}"));

Status Succeeded
Result: "{\"Application\":\"FileApp\",\"Filename\": ....}"

但是当客户端被触发时,我不知道如何访问它以将其放入服务器端逻辑中。

-------------- 更新 ------------

所以要分解它,这就是我认为hangfire 在运行时正在做的事情:

  1. var jobId = BackgroundJob.Enqueue("download-model", () => CreateModel(new DataModel()));
  2. 写入数据库
  3. 服务器正在等待
    download-model
    条目,抓取它并使用数据模型构建 URL 并下载它 - 所以在我运行的服务器上:
    RecurringJob.AddOrUpdate("download-model", () => DownloadFile(null), Cron.Minutely);
  4. 根据我的理解,它正在调用 DownloadFile (还有一个问题:我不知道如何访问参数,所以在这里我在其中写了 null 并使用了一个虚拟对象,逻辑如下:
    public static Task DownloadFile(PerformContext context)
    {
        var jobId = context.BackgroundJob.Id;
        Console.WriteLine(jobId);
    
        string url = "www.example.com/"; 
        string documentId = context.RegId; //... had dummy here instead
        
        Uri url = new System.Uri(url + documentId);
    
        var certificate = GetCertificate();
    
        if (certificate != null)
        {
           //...
           DownloadServiceClient(url, certificate);
           //...
        }
        //...
    
        return Task.CompletedTask;
    }

我真的不确定我是否理解错了

Hangfire

hangfire
1个回答
0
投票

好吧,首先这不是

Hangfire
的工作原理。

当您执行

Hangfire
时,
Enqueue
所做的是将作业定义保存到其自己的数据库中,然后
Hanfire
服务器拾取该作业,使用程序集扫描加载它并激活您的方法。

因此,在您的示例中,它只是对

DataModel
进行反序列化并返回 Json。

因此,为了让您的方法按预期工作 - 在作业中下载文档,您应该创建一个如下所示的作业:

public class DownloadJob
{
  public Task Download(DataModel model)
  {     
        Uri url = new System.Uri(model.Weburi + model.DocumentId);
    
        var certificate = GetCertificate();
    
        if (certificate != null)
        {
           //...
           DownloadServiceClient(url, certificate);
           //...
        }
        //...
    
        return Task.CompletedTask;
  }
}

所以你可以像这样将其排队:

BackgroundJob.Enqueue<DownloadJob>( job=> job.Download(model));

或者,如果您想将其与 Recuring Job 结合起来,那么我会将下载模型保存到数据库(通过存储库) - 在其自己的表中,例如 [dbo].[DownloadModel]。在重复作业中,我将有一种方法从数据库(通过存储库)获取模型并下载数据,更新已下载该模型数据的模型。

© www.soinside.com 2019 - 2024. All rights reserved.