我正在使用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
成为一个局部变量应该解决我的问题吗?
答案 0 :(得分:1)
我想你已经回答了自己的问题。每次重新编译时(或者更具体地说,每次新实例开始运行函数时),都会初始化TimeSkew
静态变量。对于同一实例的所有后续请求,TimeSkew
值保持不变,这可能会导致上述错误。
解决方案:不要将任何静态变量初始化为DateTime.Now
相关内容,除非您真的想跟踪每个实例上第一次运行的开始时间(您不会这样做)。 / p>