【问题标题】:How to Get Cosmos Db Data in Azure Mobile App Service如何在 Azure 移动应用服务中获取 Cosmos Db 数据
【发布时间】:2018-01-16 05:39:36
【问题描述】:

我尝试使用 Azure 移动应用服务获取 Cosmos Db 中的数据,我尝试了此文档https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-dotnet-application#_Toc395637765,但我无法将它从 MVC 实现到 Azure 移动应用服务,我在 ASP 中还是很新的并且不要t 真正了解所有功能,在本文档中,他们使用它从中获取数据。

public ActionResult Index()
{
    return View();
}

 [ActionName("Index")]
 public async Task<ActionResult> IndexAsync()
 {
     var items = await DocumentDBRepository<Item>.GetItemsAsync(d => !d.Completed);
     return View(items);
 } 

但是因为我的 ASP.NET 不是 MVC,所以我不能使用ActionResult(我的应用服务将没有视图),这让我感到困惑,我不知道如何返回任务,通常我使用StreamReader 返回数据,但它说我的任务不包含StreamReader

这是处理GetDataDocumentDB 类:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;

namespace gumilangService.Controllers
{
    public static class DocumentDBRepository<T> where T : class
    {
        private static readonly string DatabaseId = ConfigurationManager.AppSettings["database"];
        private static readonly string CollectionId = ConfigurationManager.AppSettings["collection"];
        private static DocumentClient client;

        public static void Initialize()
        {
            client = new DocumentClient(new Uri(ConfigurationManager.AppSettings["endpoint"]), ConfigurationManager.AppSettings["authKey"]);            
        }

        public static async Task<IEnumerable<T>> GetItemsAsync(Expression<Func<T, string>> predicate)
        {
            IDocumentQuery<T> query = client.CreateDocumentQuery<T>(
                UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId))
               // .Where(predicate)
                .AsDocumentQuery();

            List<T> results = new List<T>();
            while (query.HasMoreResults)
            {
                results.AddRange(await query.ExecuteNextAsync<T>());
            }

            return results;
        }  
    }
}

到目前为止,这是我的控制器:

public  string Get()
{
    var items =  DocumentDBRepository<MyCollection>.GetItemsAsync(d => d.Id);
    /*  using (var streamReader = new StreamReader(items.GetResponseStream()))
              {
                  var result = streamReader.ReadToEnd();
                  return result;
              }
    */
    return items.ToString();
    //return "Hello";    
}

它返回这个而不是数据:

System.Threading.Tasks.Task`1[System.Collections.Generic.IEnumerable`1[gumilangService.DataObjects.MyCollection]]

当我在 Postman 中尝试时,知道如何实现这一点并获取数据吗?

【问题讨论】:

    标签: c# asp.net asp.net-mvc azure azure-mobile-services


    【解决方案1】:

    你需要再往前走一点。

    “控制器”中的 Get() 方法返回一个字符串 - 它需要返回实际数据。 ASP 将使用 XML 或 JSON 将该数据序列化为字符串。

    public MyItem Get(string id){
        Item item = DocumentDBRepository<MyItem>.Get(x => x.Id == id);
        return item; // separate line so you can put a breakpoint here and look
    }
    

    你使用了异步方法

    var items =  DocumentDBRepository<MyCollection>.GetItemsAsync(d => d.Id);
    

    返回任务。调用异步方法的正确方法是通过将其返回类型替换为“异步任务”并在所有异步调用其他方法之前添加“等待”来使您自己的方法异步:

     var items =  await DocumentDBRepository<MyCollection>.GetItemsAsync(d => d.Id);
    

    这可能不是唯一的问题...我强烈建议您下载一些示例项目并了解它是如何工作的。

    【讨论】:

    • 在本文档中,他们使用此 return View(items);获取数据但是当我删除视图并使用返回项目时;它将返回此错误消息,不能将 System.ThreadingTask 隐含为字符串,当我将方法更改为此公共异步 Task MethodGet() 时,它仍然会收到相同的错误消息。知道我怎么能不使用视图而只将项目作为字符串数据返回
    • 您需要将控制器操作的返回类型更改为您的类的任务,而不是字符串。
    • @TheodorusAgumGumilang 您需要稍微了解一下异步/等待模式。该问题与 ASP 或 DocumentDB 无关。异步方法返回 Task&lt;SomeType&gt;。你需要await的方法调用才能得到SomeType;您只能在 async 方法中执行 await。使用其中没有 Async 的方法签名,或者使您的方法异步或获取返回的 Task 的 .Result 属性
    猜你喜欢
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2016-07-07
    • 2018-09-02
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多