是否可以在Azure移动服务.Net后端中修改表控制器以处理每个http请求的多次插入?
重新联机后,我的应用程序需要2分钟以上的时间才能同步其数据。 2分钟的70%以上浪费在网络握手开销上。

最佳答案

我不得不做类似的事情。每次用户创建新项目时,我的应用程序都会创建约10,000个新行,因此我在移动服务中创建了一个自定义控制器以接受此操作。插入10,000个实体后,我将它们全部拉回本地同步数据库。

我首先创建了一个自定义控制器。

public class BatchInsertController : ApiController
{
    DbContext context;

    protected override void Initialize(HttpControllerContext controllerContext)
    {
        base.Initialize(controllerContext);
        this.context = new DbContext();
    }

    [HttpPost]
    public async Task<bool> BatchInsert(List<Entity> entities)
    {
        try
        {
            this.context.Entities.AddRange(entities);
            await this.context.SaveChangesAsync();

            return true;
        }
        catch (System.Exception ex)
        {
            Trace.WriteLine("Error: " + ex);
            return false;
        }
    }

}


然后,我将从客户代码中调用此自定义控制器方法。

var entities = new List<Entity>();
// Add a bunch of entities to the list...

foreach (List<Entity> chunkedEntities in entities.ChunksOf(1000))
{
    var response = await _client.InvokeApiAsync<List<Entity>, bool>("batchinsert", chunkedEntities);
}


我一次将有10,000多个记录,因此我创建了一个扩展方法来对列表进行分块并一次发送1,000条记录。

public static IEnumerable<IList<T>> ChunksOf<T>(this IEnumerable<T> sequence, int size)
{
    List<T> chunk = new List<T>(size);
    foreach (T element in sequence)
    {
        chunk.Add(element);
        if (chunk.Count == size)
        {
            yield return chunk;
            chunk = new List<T>(size);
        }
    }
    if (chunk.Any())
    {
        yield return chunk;
    }
}


之后,我在本地数据库上执行了PullAsync()。通过阅读this article.之后我想到了这个

10-07 19:51
查看更多