是否可以修改Azure移动服务.Net后端中的表控制器以处理每个http请求的多插入? 重新上线后,我的应用需要2分钟才能同步其数据。超过70%的2分钟浪费在网络握手开销上。
答案 0 :(得分:0)
我必须做类似的事情。每次用户创建新项目时,我的应用程序都会创建大约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.
后,我想出了这个