我正在使用Azure移动服务。我有TableController<Photo>
。在控制器中,我可以通过id成功检索单张照片。使用以下方法没有问题:
//works
public SingleResult<Photo> GetPhoto(string id)
{
return Lookup(id);
}
但是,由于照片作为私有blob存储在Azure存储中,因此我希望使用SAS (Shared access signature)
来允许我的移动客户端在给定时间段内直接读取Azure blob。
在GetPhoto调用中,我使用CloudBlobClient
成功检索了SAS(为简洁起见,已删除)。
我在Photo上定义了一个名为SasQueryString
的属性。我想在&lt; Photo&gt;上设置它。使用Lookup(id)
检索的对象,但Lookup(id)
返回的数据是IQueryable
,而不是我强类型的Photo对象。
//! INCORRECT ! -- because photoResult is IQueryable
public SingleResult<Photo> GetPhoto(string id)
{
SingleResult<Photo> photoResult = Lookup(id);
//SingleResult<Photo> does not contain SasQueryString
photoResult.SasQueryString = "SAS from CloudBlobClient";
return photoResult;
}
如果我这样做,我可以设置SasQueryString:
Photo photoResult = (Photo)Lookup(id).Queryable.FirstOrDefault<Photo>();
photoResult.SasQueryString = "SAS from CloudBlobClient";
但是,我不确定如何将此强类型对象作为SingleResult<Photo>
返回。
//! INCORRECT ! -- this doesn't work because the Create method expects an IQueryable
return SingleResult<Photo>.Create(photoResult);
我也试过这个,但是photoResult是IQueryable
,所以我也不能用这种方式设置强类型SasQueryString
值。
//! INCORRECT !
var photoResult = Lookup(id).Queryable.Select(x => new Photo()
{
Id = x.Id,
TheOtherFields = x.TheOtherFields
});
photoResult.SasQueryString = "SAS from CloudBlobClient";
我显然在这里缺少一些关键的东西,但似乎我应该能够将照片的查找和SAS的请求合并到一个调用中,该调用在执行SAS票证后返回我的照片数据... < / p>
== UPDATE ==
我找到了以下示例:Creating a Leaderboard App with Azure Mobile Services .NET Backend。它正在做类似于我想做的事情,但我还没有尝试过。
// GET tables/PlayerRank/48D68C86-6EA6-4C25-AA33-223FC9A27959
public SingleResult<PlayerRankDto> GetPlayerRank(string id)
{
var result = Lookup(id).Queryable.Select(x => new PlayerRankDto()
{
Id = x.Id,
PlayerName = x.Player.Name,
Score = x.Score,
Rank = x.Rank
});
return SingleResult<PlayerRankDto>.Create(result);
}
根据我的情况修改的可能如下所示:
public SingleResult<Photo> GetPhoto(string id)
{
var result = Lookup(id).Queryable.Select(x => new Photo()
{
Id = x.Id,
ImageUri = x.ImageUri,
SasQueryString = GetSas(id),
});
return SingleResult<PlayerRankDto>.Create(result);
}
答案 0 :(得分:0)
你没有以正确的方式做到这一点:
当您获得照片或照片列表时,它将从数据库中的存储中提供数据并且SasQueryString未存储,只有来自blob存储的Url应该是;
您只在Insert或Update方法中提供SasQueryString,因为您需要定义网址或在需要时更新网址;
注意:获取方法不会更改数据
为什么你有照片和照片控制器?
如果你有一个物品&#34; Car&#34;有图像的,应该有&#34; car.Url&#34;以及类似于BlobItem.cs的类,您可以看到BlobStorageExtensions.cs。
注意:BlobItem.cs将是一个未映射的属性,我不希望将其保存在数据库中。
我需要用它和nugets创建一个样本......