如何使用OData和Breeze.js实现发布批量请求的长尾词?
- 内容介绍
- 文章标签
- 相关推荐
本文共计741个文字,预计阅读时间需要3分钟。
我在尝试使用Breeze.js和Web API+OData控制器来开发一个实体。以下是我的配置:
csharpconfig.Routes.MapODataRoute(odata, odata, model, new DefaultODataBatchHandler(GlobalConfiguration.Default));
我一直在尝试使用Breezejs和WebAPI OData控制器发布一个实体.以下是配置:
config.Routes.MapODataRoute( routeName: "odata", routePrefix: "odata", model: model, batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));
模型非常简单:
public class ServiceMetadata { public int ServiceMetadataId { get; set; } public string ServiceName { get; set; } public string Description { get; set; } public ObjectState? State { get; set; } public DateTime? LastUpdated { get; set; } }
它通过默认映射:
ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
客户端使用AngularJs也非常简单,部分来自Todo示例:www.breezejs.com/samples/todo-angular
breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true); var serviceName = 'localhost:8081/odata/'; breeze.config.initializeAdapterInstances({ dataService: "OData" }); var manager = new breeze.EntityManager(serviceName); manager.enableSaveQueuing(true);
实际发布使用默认的createEntity()方法完成:
function createServiceMetadata(initialValues) { return manager.createEntity('ServiceMetadata', initialValues); }
整个事情看起来像:
serviceMetadatas.createServiceMetadata({ ServiceName: $scope.newServiceName, Description: $scope.newServiceDescription }); serviceMetadatas.saveChanges();
但是,请求未被传输到正确的控制器(ServiceMetadatasController,它继承自EntitySetController),或者任何其他控制器.
HTTP请求如下所示:
POST localhost:8081/odata/$batch HTTP/1.1 Host: localhost:8081 User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0 Accept: multipart/mixed Accept-Language: he-IL,he;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate DataServiceVersion: 2.0 Content-Type: multipart/mixed; charset=UTF-8;boundary=batch_4f09-d7cf-dd99 MaxDataServiceVersion: 2.0 Referer: localhost:9000/ Content-Length: 580 Origin: localhost:9000 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache --batch_4f09-d7cf-dd99 Content-Type: multipart/mixed; boundary=changeset_ca0c-06b7-ddbe --changeset_ca0c-06b7-ddbe Content-Type: application/localhost:9000 Access-Control-Allow-Credentials: true DataServiceVersion: 2.0 X-AspNet-Version: 4.0.30319 X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcVG9tZXJcRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxMlxQcm9qZWN0c1xFYXN5Qml6eVxFYXN5Qml6eS5XZWJBUElcb2RhdGFcJGJhdGNo?= X-Powered-By: ASP.NET Date: Sun, 15 Sep 2013 14:32:39 GMT Content-Length: 443 --batchresponse_966d4460-e00e-4900-b1c9-85b17081cfac Content-Type: multipart/mixed; boundary=changesetresponse_44da5dcf-877d-4041-a82b-c51d06a4e9a4 --changesetresponse_44da5dcf-877d-4041-a82b-c51d06a4e9a4 Content-Type: application/localhost:6974/odata/$batch HTTP/1.1 Host: localhost:6974 User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0 Accept: multipart/mixed Accept-Language: he-IL,he;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate DataServiceVersion: 2.0 Content-Type: multipart/mixed; charset=UTF-8;boundary=batch_4f09-d7cf-dd99 MaxDataServiceVersion: 2.0 Referer: localhost:9000/ Content-Length: 565 Origin: localhost:9000 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache --batch_4f09-d7cf-dd99 Content-Type: multipart/mixed; boundary=changeset_ca0c-06b7-ddbe --changeset_ca0c-06b7-ddbe Content-Type: application/localhost:6974/odata/ServiceMetadatas(-1) Content-ID: 1 Content-Type: application/json; odata=verbose; charset=utf-8 DataServiceVersion: 2.0 { "d":{ "__metadata":{ "id":"localhost:6974/odata/ServiceMetadatas(-1)","uri":"localhost:6974/odata/ServiceMetadatas(-1)","type":"CleanWebApiProject.Models.ServiceMetadata" },"ServiceMetadataId":-1,"ServiceName":"sdf sdf","Description":"sd fgs df" } } --changesetresponse_b63ca946-ce66-43e6-a78f-d44a5b8f2d5c-- --batchresponse_6779b5e5-6e40-4363-9a98-5a33d062da28--
我在控制器中进行的唯一更改是以下(与批处理无关):
public class ServiceMetadatasController : EntitySetController<ServiceMetadata, int> { protected override ServiceMetadata CreateEntity(ServiceMetadata entity) { return entity; } protected override int GetKey(ServiceMetadata entity) { return entity.ServiceMetadataId; } public override IQueryable<ServiceMetadata> Get() { return new List<ServiceMetadata> { new ServiceMetadata() {ServiceName = "Service1", Description = "Desc1"}, new ServiceMetadata() {ServiceName = "Service2", Description = "Desc1"} }.AsQueryable(); } }
我希望这可以解决你的问题,如果你手动生成内部请求的url,或者如果它是为你做的breezejs,也让我知道,这样我就可以跟进并确保它得到修复.
本文共计741个文字,预计阅读时间需要3分钟。
我在尝试使用Breeze.js和Web API+OData控制器来开发一个实体。以下是我的配置:
csharpconfig.Routes.MapODataRoute(odata, odata, model, new DefaultODataBatchHandler(GlobalConfiguration.Default));
我一直在尝试使用Breezejs和WebAPI OData控制器发布一个实体.以下是配置:
config.Routes.MapODataRoute( routeName: "odata", routePrefix: "odata", model: model, batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));
模型非常简单:
public class ServiceMetadata { public int ServiceMetadataId { get; set; } public string ServiceName { get; set; } public string Description { get; set; } public ObjectState? State { get; set; } public DateTime? LastUpdated { get; set; } }
它通过默认映射:
ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
客户端使用AngularJs也非常简单,部分来自Todo示例:www.breezejs.com/samples/todo-angular
breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true); var serviceName = 'localhost:8081/odata/'; breeze.config.initializeAdapterInstances({ dataService: "OData" }); var manager = new breeze.EntityManager(serviceName); manager.enableSaveQueuing(true);
实际发布使用默认的createEntity()方法完成:
function createServiceMetadata(initialValues) { return manager.createEntity('ServiceMetadata', initialValues); }
整个事情看起来像:
serviceMetadatas.createServiceMetadata({ ServiceName: $scope.newServiceName, Description: $scope.newServiceDescription }); serviceMetadatas.saveChanges();
但是,请求未被传输到正确的控制器(ServiceMetadatasController,它继承自EntitySetController),或者任何其他控制器.
HTTP请求如下所示:
POST localhost:8081/odata/$batch HTTP/1.1 Host: localhost:8081 User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0 Accept: multipart/mixed Accept-Language: he-IL,he;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate DataServiceVersion: 2.0 Content-Type: multipart/mixed; charset=UTF-8;boundary=batch_4f09-d7cf-dd99 MaxDataServiceVersion: 2.0 Referer: localhost:9000/ Content-Length: 580 Origin: localhost:9000 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache --batch_4f09-d7cf-dd99 Content-Type: multipart/mixed; boundary=changeset_ca0c-06b7-ddbe --changeset_ca0c-06b7-ddbe Content-Type: application/localhost:9000 Access-Control-Allow-Credentials: true DataServiceVersion: 2.0 X-AspNet-Version: 4.0.30319 X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcVG9tZXJcRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxMlxQcm9qZWN0c1xFYXN5Qml6eVxFYXN5Qml6eS5XZWJBUElcb2RhdGFcJGJhdGNo?= X-Powered-By: ASP.NET Date: Sun, 15 Sep 2013 14:32:39 GMT Content-Length: 443 --batchresponse_966d4460-e00e-4900-b1c9-85b17081cfac Content-Type: multipart/mixed; boundary=changesetresponse_44da5dcf-877d-4041-a82b-c51d06a4e9a4 --changesetresponse_44da5dcf-877d-4041-a82b-c51d06a4e9a4 Content-Type: application/localhost:6974/odata/$batch HTTP/1.1 Host: localhost:6974 User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0 Accept: multipart/mixed Accept-Language: he-IL,he;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate DataServiceVersion: 2.0 Content-Type: multipart/mixed; charset=UTF-8;boundary=batch_4f09-d7cf-dd99 MaxDataServiceVersion: 2.0 Referer: localhost:9000/ Content-Length: 565 Origin: localhost:9000 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache --batch_4f09-d7cf-dd99 Content-Type: multipart/mixed; boundary=changeset_ca0c-06b7-ddbe --changeset_ca0c-06b7-ddbe Content-Type: application/localhost:6974/odata/ServiceMetadatas(-1) Content-ID: 1 Content-Type: application/json; odata=verbose; charset=utf-8 DataServiceVersion: 2.0 { "d":{ "__metadata":{ "id":"localhost:6974/odata/ServiceMetadatas(-1)","uri":"localhost:6974/odata/ServiceMetadatas(-1)","type":"CleanWebApiProject.Models.ServiceMetadata" },"ServiceMetadataId":-1,"ServiceName":"sdf sdf","Description":"sd fgs df" } } --changesetresponse_b63ca946-ce66-43e6-a78f-d44a5b8f2d5c-- --batchresponse_6779b5e5-6e40-4363-9a98-5a33d062da28--
我在控制器中进行的唯一更改是以下(与批处理无关):
public class ServiceMetadatasController : EntitySetController<ServiceMetadata, int> { protected override ServiceMetadata CreateEntity(ServiceMetadata entity) { return entity; } protected override int GetKey(ServiceMetadata entity) { return entity.ServiceMetadataId; } public override IQueryable<ServiceMetadata> Get() { return new List<ServiceMetadata> { new ServiceMetadata() {ServiceName = "Service1", Description = "Desc1"}, new ServiceMetadata() {ServiceName = "Service2", Description = "Desc1"} }.AsQueryable(); } }
我希望这可以解决你的问题,如果你手动生成内部请求的url,或者如果它是为你做的breezejs,也让我知道,这样我就可以跟进并确保它得到修复.

