分页时,Azure Easy Tables丢失并重复数据

时间:2018-04-25 16:01:59

标签: c# database azure

我有一个REST调用来从用于基于Azure的应用程序的小型(145行)EasyTable中提取所有数据。

在提取数据时,响应表明我需要页面来收集所有数据。它一次以50行的方式返回数据。下面的代码收集响应,直到不再返回数据。当我运行它时,第一个响应为我提供了50个唯一的行,并包含一个$top=950&$skip=50字段用于后续调用。但是,当我进行该调用时,它也返回50行,但有些是前50行的重复。它继续这样直到我得到145行,但由于有些是重复的,我缺少一些行,并且有一些冗余的行。

表中的数据在所有调用期间都是不变的,它每隔几天就会更改一次,并且我确认在我的任何测试期间都没有更改。

我知道我可以重新考虑和简化代码,但我找不到任何可能导致我的问题。任何指针在哪里看?

我尝试使用$filter并更改$top=200,但唯一有效的方法是确保过滤器永远不会返回超过50行。不幸的是,由于数据可能会发生变化,因此设置一系列调用会需要额外的字段来查询。如果需要的话,我最终会这样做,但看起来传呼应该可行。

private string AzureTablesStandardGet(string tableURL, string queryString)
{
    GetAzuremysite();
    CookieContainer cookieJar = new CookieContainer();
    string uriQueryString = System.Uri.EscapeUriString(queryString);
    string sURL = string.Format("https://mysite.azurewebsites.net/tables{0}?{1}", tableURL, uriQueryString);

    WebRequest wrGETURL;
    wrGETURL = WebRequest.Create(sURL);
    wrGETURL.Proxy = WebRequest.GetSystemWebProxy();
    wrGETURL.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
    wrGETURL.Headers.Add("ZUMO-API-VERSION", "2.0.0"); 
    wrGETURL.Headers.Add("X-ZUMO-AUTH", mysite.access_token);   
    wrGETURL.ContentType = "application/json;odata=nometadata";
    wrGETURL.Method = "GET";
    ((HttpWebRequest)wrGETURL).Date = DateTime.UtcNow;
    ((HttpWebRequest)wrGETURL).CookieContainer = cookieJar;

    string sLine = "";

    var mine = "first";
    try
    {
        while (mine.Equals("first") || mine.ToLower().Contains("rel=next"))
        {
            var httpResponse = (HttpWebResponse)wrGETURL.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                string newLine = streamReader.ReadToEnd();
                sLine += newLine;
            }
            mine = httpResponse.GetResponseHeader("Link");
            if (mine.ToLower().Contains("rel=next"))
            {
                string newURL = mine.Split(';')[0];
                newURL = newURL.Split('?')[1];
                sURL = string.Format("{0}?{1}", sURL.Split('?')[0], newURL);
                wrGETURL = WebRequest.Create(sURL);
                ((HttpWebRequest)wrGETURL).CookieContainer = cookieJar;
                wrGETURL.Proxy = WebRequest.GetSystemWebProxy();
                wrGETURL.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
                wrGETURL.Headers.Add("ZUMO-API-VERSION", "2.0.0");
                wrGETURL.Headers.Add("X-ZUMO-AUTH", mysite.access_token); 
                wrGETURL.ContentType = "application/json;odata=nometadata";
                ((HttpWebRequest)wrGETURL).Date = DateTime.UtcNow;
                wrGETURL.Method = "GET";
                }
            }
        }
        catch (WebException e)
        {
            Console.WriteLine(e.Message);
            System.Threading.Thread.Sleep(1000);
        }
        sLine = sLine.Replace("][",",");
        return sLine;
    }
}
}

因此,作为一个例子,第一个调用将是:

https://mysite.azurewebsites.net/tables/mytable?$top=1000

和第二个,基于链接头中的响应:

header = http://mysite.azurewebsites.net/?%24top=950&%24skip=50; rel=next

GET call = https://mysite.azurewebsites.net/tables/mytable?%24top=950&%24skip=50

我尝试拨打第一个电话

https://mysite.azurewebsites.net/tables/mytable?$top=1000&$skip=0

但它并没有什么区别

<小时/> 更新2018-04-26

更改代码以手动索引表格,每次50个项目返回所有数据,没有任何重复。现在我真的很困惑。

这个调用序列返回145个项目,但有些是重复项,因此不会返回所有数据。请注意,虽然每个请求请求的行数超过50行,但服务器只返回50行,并且链接标头表示并未返回所有数据,并且它包含我应该使用的参数来获取剩余的数据。

https://mysite.azurewebsites.net/tables/mytable?%24top=1000   
https://mysite.azurewebsites.net/tables/mytable?%24top=950&%24skip=50
https://mysite.azurewebsites.net/tables/mytable?%24top=900&%24skip=100

因为我使用Link rel = next not present,所以不需要第四次调用,这意味着停止询问数据

这一系列调用返回所有数据,没有任何重复

https://mysite.azurewebsites.net/tables/mytable?%24top=50&%24skip=0
https://mysite.azurewebsites.net/tables/mytable?%24top=50&%24skip=50
https://mysite.azurewebsites.net/tables/mytable?%24top=50&%24skip=100

然而,它需要第四次调用,返回一个空数组“[]”,我用它来表示我收集了所有信息,我可以停止。

https://mysite.azurewebsites.net/tables/mytable?%24top=50&%24skip=150

由于$top=xx表示总共要返回多少项,而不是每页,因此调用应该返回相同的结果,但它们不会。

0 个答案:

没有答案