为Azure Media Services资产创建按需loactor时出现异常

时间:2017-09-10 11:15:21

标签: c# azure azure-media-services

我正在使用Azure Functions访问Azure Media Services。我有一个HTTP触发器,它将为我提供视频文件的流媒体链接。 当我尝试创建按需流式定位器时,服务器有时会返回以下错误:

  

发生了一个或多个错误。 Microsoft.WindowsAzure.MediaServices.Client:处理此请求时发生错误。   定位器的ExpirationDateTime不能过去

以下是代码的一部分:

using System.Net;
using Microsoft.WindowsAzure.MediaServices.Client;
...
public static readonly TimeSpan ExpirationTimeThreshold = TimeSpan.FromHours(5);
public static readonly DateTime TimeSkew = DateTime.UtcNow.AddMinutes(-5);
...

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    string assetId = req.GetQueryNameValuePairs().FirstOrDefault(q => string.Compare(q.Key, "assetId", true) == 0).Value;

    IAsset wantedAsset = _context.Assets.Where(a => a.Id.Equals(assetId)).FirstOrDefault();

    if (wantedAsset == null)
    {
        return req.CreateResponse(HttpStatusCode.BadRequest,
        "No asset matches the Id");

    }

    originLocator = wantedAsset.Locators.Where(l => l.Type == LocatorType.OnDemandOrigin).FirstOrDefault();

    if (originLocator == null)
    {
        IAccessPolicy policy = _context.AccessPolicies.Create("Streaming policy",
        ExpirationTimeThreshold,
        AccessPermissions.Read);

        originLocator = _context.Locators.CreateLocator(LocatorType.OnDemandOrigin, wantedAsset,
        policy, 
        TimeSkew); //This is where the exception is returned
    }
    ...
}

这似乎是非常不一致的行为,因为它在大多数情况下都会按预期工作。 一旦发生这种情况,我尝试在Azure函数中放入日志语句,当我保存更改时,函数按预期工作。

我在写这篇文章时意识到的一件事是,在将更改保存到Azure Functions之前,TimeSkew变量不会更新。 这意味着第一次运行时,TimeSkew例如是下午5:00,5小时后TimeSkew仍然是下午5:00,这意味着ExpirationTimeThreshold和{{ 1}}会相互否定吗?

使TimeSkew成为一个局部变量应该解决我的问题吗?

1 个答案:

答案 0 :(得分:1)

我想你已经回答了自己的问题。每次重新编译时(或者更具体地说,每次新实例开始运行函数时),都会初始化TimeSkew静态变量。对于同一实例的所有后续请求,TimeSkew值保持不变,这可能会导致上述错误。

解决方案:不要将任何静态变量初始化为DateTime.Now相关内容,除非您真的想跟踪每个实例上第一次运行的开始时间(您不会这样做)。 / p>