如何在 Azure 移动应用服务中获取 Cosmos Db 数据
How to Get Cosmos Db Data in Azure Mobile App Service
我尝试使用 Azure 移动应用服务在 Cosmos Db 中获取数据,我尝试了此文档 https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-dotnet-application#_Toc395637765 但我无法将其从 MVC 实现到 Azure 移动应用服务,我在ASP 并没有真正理解所有功能,在本文档中,他们使用它从中获取数据。
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
(我的 App Service 没有视图),这让我感到困惑,我不知道如何 return 任务,通常我使用 StreamReader
来 return 数据,但它说我的任务不包含 StreamReader
这是处理 GetData
:
的 DocumentDB
class
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";
}
它 return 而不是数据:
System.Threading.Tasks.Task`1[System.Collections.Generic.IEnumerable`1[gumilangService.DataObjects.MyCollection]]
当我在 Postman 中尝试时,知道如何实现它并获取数据吗?
你需要再往回走一点。
您的 Get() 方法在 "controller" return 中是一个字符串 - 它需要 return 实际数据。 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);
哪个 returns 任务。调用异步方法的正确方法是通过将其 return 类型替换为 "async Task" 并在对其他方法的所有异步调用之前添加 "await" 来使您自己的方法异步:
var items = await DocumentDBRepository<MyCollection>.GetItemsAsync(d => d.Id);
这可能不是唯一的问题...我强烈建议您下载一些示例项目并了解它是如何工作的。
我尝试使用 Azure 移动应用服务在 Cosmos Db 中获取数据,我尝试了此文档 https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-dotnet-application#_Toc395637765 但我无法将其从 MVC 实现到 Azure 移动应用服务,我在ASP 并没有真正理解所有功能,在本文档中,他们使用它从中获取数据。
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
(我的 App Service 没有视图),这让我感到困惑,我不知道如何 return 任务,通常我使用 StreamReader
来 return 数据,但它说我的任务不包含 StreamReader
这是处理 GetData
:
DocumentDB
class
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";
}
它 return 而不是数据:
System.Threading.Tasks.Task`1[System.Collections.Generic.IEnumerable`1[gumilangService.DataObjects.MyCollection]]
当我在 Postman 中尝试时,知道如何实现它并获取数据吗?
你需要再往回走一点。
您的 Get() 方法在 "controller" return 中是一个字符串 - 它需要 return 实际数据。 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);
哪个 returns 任务。调用异步方法的正确方法是通过将其 return 类型替换为 "async Task" 并在对其他方法的所有异步调用之前添加 "await" 来使您自己的方法异步:
var items = await DocumentDBRepository<MyCollection>.GetItemsAsync(d => d.Id);
这可能不是唯一的问题...我强烈建议您下载一些示例项目并了解它是如何工作的。