【问题标题】:Send multiple of items to WCF Dataservice at once?一次将多个项目发送到 WCF 数据服务?
【发布时间】:2014-04-09 15:20:02
【问题描述】:

我使用 WCF 数据服务作为允许项目中的其他 Web 服务连接到数据库的一种方式。我的问题是我我们的项目有一个爬虫,每小时向数据库添加数十个项目。

使用 AddToItems 方法(由 ADO.NET 自动生成)导致 超时异常 或者至少它使爬虫需要等待很多时间考虑到 Addto 方法独立处理每个。

*注意事项: 1- 我添加了一个拦截器来添加项目以在添加新项目时执行一些操作。

2- WCF 数据服务服务操作不允许采用用户定义的数据类型的参数,这使我无法创建将项目列表作为参数的服务操作,以便能够每次处理多个项目同时允许客户端异步处理。

当我尝试序列化此列表以便将其视为字符串时,由于 url 的长度限制,即使使用 POST 而不是 Get,也会发生异常。

更新:通过 BeginSaveChanged 和 EndSaveChanged 保存更改在一定程度上解决了问题,但我仍在寻找更好的解决方案

【问题讨论】:

  • 你应该延长超时时间
  • 我想提高性能而不是增加超时:)

标签: c# web-services odata wcf-data-services


【解决方案1】:

也许 OData 功能 Batch 可以满足您的要求:

    var client = new Container(serviceUrl);
    client.Format.UseJson();

    DefaultBatchCustomer customer0ToAdd = new DefaultBatchCustomer { Id = 10, Name = "Customer 10" };
    DefaultBatchCustomer customer0ToAdd = new DefaultBatchCustomer { Id = 11, Name = "Customer 11" };

    client.AddToDefaultBatchCustomer(customer0ToAdd);
    client.AddToDefaultBatchCustomer(customer1ToAdd);

    var response = await client.SaveChangesAsync(SaveChangesOptions.BatchWithSingleChangeset);

请求看起来像:

POST http://jinfutanwebapi1:9123/DefaultBatch/$batch HTTP/1.1
OData-Version: 4.0;NetFx
OData-MaxVersion: 4.0;NetFx
Content-Type: multipart/mixed; boundary=batch_8ce61768-e8bb-4117-954b-9bc43e05baef
Accept: multipart/mixed
Accept-Charset: UTF-8
User-Agent: Microsoft ADO.NET Data Services
Host: jinfutanwebapi1:9123
Content-Length: 1772
Expect: 100-continue

--batch_8ce61768-e8bb-4117-954b-9bc43e05baef
Content-Type: multipart/mixed; boundary=changeset_b36bec94-fc3b-4d89-99cc-0610fcec8148

--changeset_b36bec94-fc3b-4d89-99cc-0610fcec8148
Content-Type: application/http
Content-Transfer-Encoding: binary

POST http://jinfutanwebapi1:9123/DefaultBatch/DefaultBatchCustomer HTTP/1.1
Content-ID: 13
OData-Version: 4.0;NetFx
OData-MaxVersion: 4.0;NetFx
Content-Type: application/json;odata.metadata=minimal
Accept: application/json;odata.metadata=minimal
Accept-Charset: UTF-8
User-Agent: Microsoft ADO.NET Data Services

{"@odata.type":"#WebStack.QA.Test.OData.Batch.Tests.DataServicesClient.DefaultBatchCustomer","Id":10,"Name":"Customer 10"}
--changeset_b36bec94-fc3b-4d89-99cc-0610fcec8148
Content-Type: application/http
Content-Transfer-Encoding: binary

POST http://jinfutanwebapi1:9123/DefaultBatch/DefaultBatchCustomer HTTP/1.1
Content-ID: 14
OData-Version: 4.0;NetFx
OData-MaxVersion: 4.0;NetFx
Content-Type: application/json;odata.metadata=minimal
Accept: application/json;odata.metadata=minimal
Accept-Charset: UTF-8
User-Agent: Microsoft ADO.NET Data Services

{"@odata.type":"#WebStack.QA.Test.OData.Batch.Tests.DataServicesClient.DefaultBatchCustomer","Id":11,"Name":"Customer 11"}
--changeset_b36bec94-fc3b-4d89-99cc-0610fcec8148--
--batch_8ce61768-e8bb-4117-954b-9bc43e05baef--

【讨论】:

  • 我在我的问题中提到了这个解决方案作为更新:) 我在问是否还有其他选择
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
相关资源
最近更新 更多