从Azure Mobile Services中的TableController修改SingleResult <t>,然后将其返回给客户端?</t>

时间:2015-02-03 06:59:44

标签: azure-mobile-services

我正在使用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);
}

1 个答案:

答案 0 :(得分:0)

你没有以正确的方式做到这一点:

  • 当您获得照片或照片列表时,它将从数据库中的存储中提供数据并且SasQueryString未存储,只有来自blob存储的Url应该是;

  • 您只在Insert或Update方法中提供SasQueryString,因为您需要定义网址或在需要时更新网址;

注意:获取方法不会更改数据

  • 当客户端应用插入照片后,后端应该:
    • 为照片创建网址并生成SasQueryString
    • 使用url create在数据库中保存照片
    • 在返回照片之前设置SasQueryString
    • 客户端应用使用您提供的SasQueryString和网址将图片上传到blob

为什么你有照片和照片控制器?

如果你有一个物品&#34; Car&#34;有图像的,应该有&#34; car.Url&#34;以及类似于BlobItem.cs的类,您可以看到BlobStorageExtensions.cs

注意BlobItem.cs将是一个未映射的属性,我不希望将其保存在数据库中。

我需要用它和nugets创建一个样本......