是否可以在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.之后我想到了这个