Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式将Azure WebJob标记为失败?_C#_Azure_Webjob - Fatal编程技术网

C# 如何以编程方式将Azure WebJob标记为失败?

C# 如何以编程方式将Azure WebJob标记为失败?,c#,azure,webjob,C#,Azure,Webjob,有没有一种方法可以在不引发异常的情况下将WebJob(已触发,而非连续)标记为失败?我需要检查某些条件是否正确,以将作业标记为成功。根据TriggeredFunctionExecutor类中的代码 public async Task<FunctionResult> TryExecuteAsync(TriggeredFunctionData input, CancellationToken cancellationToken) { IFunctionInstance inst

有没有一种方法可以在不引发异常的情况下将WebJob(已触发,而非连续)标记为失败?我需要检查某些条件是否正确,以将作业标记为成功。

根据TriggeredFunctionExecutor类中的代码

public async Task<FunctionResult> TryExecuteAsync(TriggeredFunctionData input, CancellationToken cancellationToken)
{

    IFunctionInstance instance = _instanceFactory.Create((TTriggerValue)input.TriggerValue, input.ParentId);
    IDelayedException exception = await _executor.TryExecuteAsync(instance, cancellationToken);
    FunctionResult result = exception != null ?
        new FunctionResult(exception.Exception)

        : new FunctionResult(true);
    return result;  
}
要使用ExecutionContext作为参数,您需要在运行WebJob之前使用NuGet安装Azure WebJobs SDK扩展并调用UserCore方法

var config = new JobHostConfiguration();
config.UseCore();
var host = new JobHost(config);
host.RunAndBlock();

引发非托管异常将导致执行失败。
但我注意到,这也会导致您的消息管理不善:即,您的消息将退出队列,但不会移动到有关您的配置的毒药队列(但可能是由于我的SDK版本).

@Jean NETR-VALERE WebJobs包的较新版本会按照您所说的那样运行,如果引发异常,作业将失败,并将继续反复运行,直到您最终清除队列。这绝对是可怕的行为,我不知道他们为什么要改变这一点


是的,他们确实改变了它,使它以这种方式工作,因为我使用的webjobs包的旧版本正是出于这个原因。大约3个月前,我升级到了新版本,不久之后我就不明白为什么会发生上述行为。一旦我恢复到旧版本,它再次开始正常工作,失败5次后被移动到中毒队列,不再运行。我的观点是,如果你想要正确的(IMO)行为,看看你是否可以回到使用1.1.0版,你会很高兴的。希望有帮助。

要将触发的web作业标记为失败,只需将进程退出代码设置为非零

System.Environment.ExitCode = 1;

当您抛出未处理的异常时,它还会设置退出代码,这就是Azure确定失败的方式。

感谢您指出SDK,这将非常有用。我将使用一个异常,它看起来更简单,但如果将来需要,我会记住另一个选项。
System.Environment.ExitCode = 1;