Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.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# 我可以在asp.net mvc站点触发的特定日期运行Azure功能一次吗?_C#_Asp.net Mvc_Azure_Azure Functions - Fatal编程技术网

C# 我可以在asp.net mvc站点触发的特定日期运行Azure功能一次吗?

C# 我可以在asp.net mvc站点触发的特定日期运行Azure功能一次吗?,c#,asp.net-mvc,azure,azure-functions,C#,Asp.net Mvc,Azure,Azure Functions,我知道我可以创建一个按计划运行的Azure函数。但我想要的是,一旦给定一个特定的日期/时间以及一些数据参数,就能够运行Azure函数 我正在我的网站上安排课程,我想在课程结束后给所有学生发电子邮件。因此,当为10月9日星期一下午4:00创建类时,我想在同一天发送一条消息来触发我的Azure函数,但大约1小时后的下午5:00。我想给它传递一些信息,比如类id之类的。如果类被取消,我还希望能够删除这个排队的触发器 这在Azure和我的ASP.Net MVC站点中可能吗?您应该为此使用。您可以让MVC

我知道我可以创建一个按计划运行的Azure函数。但我想要的是,一旦给定一个特定的日期/时间以及一些数据参数,就能够运行Azure函数

我正在我的网站上安排课程,我想在课程结束后给所有学生发电子邮件。因此,当为10月9日星期一下午4:00创建类时,我想在同一天发送一条消息来触发我的Azure函数,但大约1小时后的下午5:00。我想给它传递一些信息,比如类id之类的。如果类被取消,我还希望能够删除这个排队的触发器

这在Azure和我的ASP.Net MVC站点中可能吗?

您应该为此使用。您可以让MVC应用程序将对象添加到Azure存储队列。这些消息可以包含该类独有的数据参数(即学生列表、教授姓名等),并且在执行此操作时,您可以使用
visibilitytimeout
参数延迟队列中的可见性

您可以通过从当前时间中减去所需时间来计算可见性超时。请注意,超时时间不能超过7天,因此,如果这些事件正在长时间排队,则可能会强制您重复将消息重新插入队列,直到您在7天范围内并且您可以成功处理消息

我的课程可能比当前日期提前30天


据我所知,您还可以利用来自Azure服务总线并为消息设置
scheduledQueueTimeUTC
属性。有关触发service bus queue消息的更多详细信息,请参见。要发送消息,可以在MVC应用程序中安装,并利用发送计划消息和取消计划消息。此外,您可以按照本文中的代码片段进行操作。

实现这一点的另一种可能方法是使用。我采用了这个模式5的解决方案,因为你有潜在的人际互动,比如取消课程

下面是一个未经测试的orchestrator函数的大致框架。您的电子邮件逻辑将包含在一个名为SendEmail的函数中,该函数使用ActivityTrigger,您可以添加新类并通过使用来取消它们

公共静态异步任务运行(DurableOrchestrationContext ctx)
{
var classInfo=ctx.GetInput();
var targetDateTime=DateTime.Parse(classInfo.ClassEndDateString);
var maxTimeSpan=新的时间跨度(96,0,0);
使用(var timeoutCts=new CancellationTokenSource())
{
while(true)
{
TimeSpan timeLeft=targetDateTime.Subtract(ctx.CurrentUtcDateTime);
如果(timeLeft maxTimeSpan){
checkTime=ctx.CurrentUtcDateTime.Add(maxTimeSpan);
}否则{
checkTime=ctx.CurrentUtcDateTime.Add(timeLeft);
}
Task durableTimeout=ctx.CreateTimer(checkTime,timeoutCts.Token);
任务取消事件=ctx.WaitForExternalEvent(“取消”);
if(cancellationEvent==wait Task.wheny(cancellationEvent,durableTimeout))
{
timeoutCts.Cancel();
返回
}
}
等待ctx.CallActivityAsync(“sendmail”,classInfo.ClassData);
}
}
公共类ClassInfo{
公共字符串ClassEndDateString{get;set;}
公共字符串类数据{get;set;}
} 

你好,康纳。因此,如果我想在周一下午4点触发我的函数,我会将“NextVisibleTime”设置为周一下午4点。那么当它变得可见时,它会触发函数运行吗?这就是它的工作原理吗?原来
NextVisibleTime
是一个只读字段。我对答案进行了编辑,以反映您实际将如何使用所需的
下一次可视时间
添加消息。我认为这对我来说不是一个好的解决方案,或者可能太复杂,以至于不必每隔7天将消息重新插入队列。我的课程可能会比当前日期提前30天。嗨,布鲁斯,这些预定的消息能运行Azure功能吗?阅读您提供的服务总线绑定链接时,我有点不知所措。服务总线绑定的具体用途是什么?您可以使用azure函数的
ServiceBustigger
从特定服务总线队列触发计划队列消息,然后提取消息信息并将电子邮件发送给您的学生。这是一个触发的例子,你可以参考。你知道Azure是否有一个电话号码,我可以打电话问问题,即使我必须付费。我只是觉得有点不知所措,阅读所有的文档花费的时间太长了。我建议您自己开始使用azure服务总线队列触发的azure功能。您可以遵循并在azure门户上创建azure功能。此外,您还可以通过VisualStudio在本地开发azure功能。您可以关注的详细信息和此视频。
public static async Task Run(DurableOrchestrationContext ctx)
{
    var classInfo = ctx.GetInput<ClassInfo>();
    var targetDateTime = DateTime.Parse(classInfo.ClassEndDateString);
    var maxTimeSpan = new TimeSpan(96, 0, 0);
    using (var timeoutCts = new CancellationTokenSource())
    {
        while(true)
        {
            TimeSpan timeLeft = targetDateTime.Subtract(ctx.CurrentUtcDateTime);
            if(timeLeft <= TimeSpan.Zero) {
                break;
            }

            DateTime checkTime; 
            if(timeLeft > maxTimeSpan) {
                checkTime = ctx.CurrentUtcDateTime.Add(maxTimeSpan);
            } else {
                checkTime = ctx.CurrentUtcDateTime.Add(timeLeft);
            }

            Task durableTimeout = ctx.CreateTimer(checkTime, timeoutCts.Token);

            Task<bool> cancellationEvent = ctx.WaitForExternalEvent<bool>("Cancellation");
            if (cancellationEvent == await Task.WhenAny(cancellationEvent, durableTimeout))
            {
                timeoutCts.Cancel();
                return
            }
        }
        await ctx.CallActivityAsync("SendEmail", classInfo.ClassData);
    }
}

public class ClassInfo {
    public string ClassEndDateString {get; set; }
    public string ClassData {get; set;}
}