使用Web应用程序在DocumentDB中进行分页

时间:2015-03-11 09:45:27

标签: c# azure get paging azure-cosmosdb

这是我试图为DocumentDB实现分页的代码,以便让所有学生都进入第10节A部分。

它在控制台应用程序中运行良好。

但是,当我尝试在我的Web应用程序中进行异步调用(即query.ExecuteNextAsync())时,进程正在终止,它甚至不会给出任何异常。

public List<Student> allStudents()
        {
            int class = 10;
            string section = "A";
            string documentType = "Student";
            List<Student> students = new List<Student>();
            string DocumentDBCollectionLink = "CollectionLink";
            DocumentClient dc = new DocumentClient(new Uri("https://xyz.documents.azure.com:443/"), "authenticationKey==");
            IDocumentQuery<Student> query;
            String continuation = "";
            do
            {
                FeedOptions feedOptions = new FeedOptions { MaxItemCount = 10, RequestContinuation = continuation };
                query = dc.CreateDocumentQuery<Student>(DocumentDBCollectionLink, feedOptions).Where(d => d.Type.Equals(documentType) && d.Class.Equals(class) && d.Section.Equals(section)).AsDocumentQuery();

                FeedResponse<Student> pagedResults = this.getRecords(query).Result;
                foreach (Student system in pagedResults)
                {
                    students.Add(system);
                }
                continuation = pagedResults.ResponseContinuation;
            } while (!String.IsNullOrEmpty(continuation));
            return students;
        }
    private async Task<FeedResponse<Student>> getRecords(IDocumentQuery<Student> query)
    {
        FeedResponse<Student> pagedResults = await query.ExecuteNextAsync<Student>();
        return pagedResults;
    }

我不知道为什么它在控制台应用程序中执行,而不是在Web应用程序中执行。

这有什么不对吗?

或者更好的方法来获得结果?

非常感谢任何帮助。

提前致谢。

5 个答案:

答案 0 :(得分:2)

尝试使用

FeedResponse pagedResults = query.ExecuteNextAsync()。结果;

检查这个

答案 1 :(得分:2)

FeedResponse pagedResults = query.ExecuteNextAsync().Result;

此行以阻塞方式调用异步方法,并可能导致asp.net环境中的死锁。 见:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

答案 2 :(得分:2)

所有异步方法都应该是Web调用中的ConfigureAwait(false)

query.ExecuteNextAsync().ConfigureAwait(false)

答案 3 :(得分:1)

FeedResponse pagedResults = query.ExecuteNextAsync()。结果;

它对我来说很好,但我需要它不工作的原因

答案 4 :(得分:0)

不要使用ConfigureAwait(false),因为你不会得到结果。 此外,不要将异步代码与同步代码混合使用。这是灾难的收据。即使有人这么说.Result -works-,相信我,它不是在异步上下文中运行的服务器环境中。 - 为什么它不起作用,是一个漫长的故事。我现在不试图解释:)

所以去吧:

 public async List<Student> allStudentsAsync()
        {

         result = new List<Student>();
        while (query.HasMoreResults)
        {
            var response = await query.ExecuteNextAsync<T>();
                         result.AddRange(response);
        }