odata – 与Breezejs发布批量请求
我一直在尝试使用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示例:http://www.breezejs.com/samples/todo-angular breeze.config.initializeAdapterInstance("modelLibrary","backingStore",true); var serviceName = 'http://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 http://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: http://localhost:9000/ Content-Length: 580 Origin: http://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/http Content-Transfer-Encoding: binary POST ServiceMetadatas HTTP/1.1 Content-ID: 1 DataServiceVersion: 2.0 Accept: application/atomsvc+xml;q=0.8,application/json;odata=verbose;q=0.5,*/*;q=0.1 Content-Type: application/json;odata=verbose MaxDataServiceVersion: 2.0 {"ServiceMetadataId":-1,"ServiceName":"sdf sdf","Description":"sd fgs df","LastUpdated":null} --changeset_ca0c-06b7-ddbe-- --batch_4f09-d7cf-dd99-- 并回应: HTTP/1.1 202 Accepted Cache-Control: no-cache Pragma: no-cache Content-Type: multipart/mixed; boundary=batchresponse_966d4460-e00e-4900-b1c9-85b17081cfac Expires: -1 Server: Microsoft-IIS/8.0 Access-Control-Allow-Origin: http://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/http Content-Transfer-Encoding: binary HTTP/1.1 406 Not Acceptable Content-ID: 1 --changesetresponse_44da5dcf-877d-4041-a82b-c51d06a4e9a4-- --batchresponse_966d4460-e00e-4900-b1c9-85b17081cfac-- 知道黑客正在发生什么吗? 附: 谢谢. @UPDATE看到哈维尔的好答案!! 在使用微风代码挖掘allllot之后,我开始意识到问题在于breezejs的createChangeRequests(),就在这里: request.requestUri = entity.entityType.defaultResourceName; 由于某种原因,defaultResouceName完全忽略了该实体的路径. manager.metadataStore.getEntityType(ENTITY_TYPE).setProperties({defaultResourceName: THE_MISSING_PART_FROM_THE_URL + ENTITY_TYPE}); manager.createEntity(ENTITY_TYPE,values); 不是很好,但仍然有效! 解决方法
问题出在内部请求的url中.网址需要与主机相关.假设您的服务托管在主机/服务中(在我们的例子中,服务将等同于odata前缀),因此通常您会发送主机/服务/客户或/ service / Customers等请求.
发出批处理请求时,内部请求中的URL可能是绝对的或相对于主机.问题是在您的请求中,URL是ServiceMetadatas,它相对于服务根,而不是主机. Web API将相对URL解释为host / ServiceMetadatas而不是host / service / ServiceMetadatas,这就是导致错误的原因. 根据您的repro项目,以下请求正常工作: POST http://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,deflate DataServiceVersion: 2.0 Content-Type: multipart/mixed; charset=UTF-8;boundary=batch_4f09-d7cf-dd99 MaxDataServiceVersion: 2.0 Referer: http://localhost:9000/ Content-Length: 565 Origin: http://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/http Content-Transfer-Encoding: binary POST odata/ServiceMetadatas HTTP/1.1 Content-ID: 1 DataServiceVersion: 2.0 Accept: application/atomsvc+xml;q=0.8,"Description":"sd fgs df"} --changeset_ca0c-06b7-ddbe-- --batch_4f09-d7cf-dd99-- 相关的响应如下: HTTP/1.1 202 Accepted Cache-Control: no-cache Pragma: no-cache Content-Type: multipart/mixed; boundary=batchresponse_6779b5e5-6e40-4363-9a98-5a33d062da28 Expires: -1 Server: Microsoft-IIS/8.0 DataServiceVersion: 2.0 X-AspNet-Version: 4.0.30319 X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcamFjYWx2YXJcRG93bmxvYWRzXE9EYXRhQmF0Y2gtbWFzdGVyXENsZWFuV2ViQXBpUHJvamVjdFxvZGF0YVwkYmF0Y2g=?= X-Powered-By: ASP.NET Date: Tue,17 Sep 2013 16:48:50 GMT Content-Length: 872 --batchresponse_6779b5e5-6e40-4363-9a98-5a33d062da28 Content-Type: multipart/mixed; boundary=changesetresponse_b63ca946-ce66-43e6-a78f-d44a5b8f2d5c --changesetresponse_b63ca946-ce66-43e6-a78f-d44a5b8f2d5c Content-Type: application/http Content-Transfer-Encoding: binary HTTP/1.1 201 Created Location: http://localhost:6974/odata/ServiceMetadatas(-1) Content-ID: 1 Content-Type: application/json; odata=verbose; charset=utf-8 DataServiceVersion: 2.0 { "d":{ "__metadata":{ "id":"http://localhost:6974/odata/ServiceMetadatas(-1)","uri":"http://localhost:6974/odata/ServiceMetadatas(-1)","type":"CleanWebApiProject.Models.ServiceMetadata" },"ServiceMetadataId":-1,"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,也让我知道,这样我就可以跟进并确保它得到修复. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- wcf – .Net Core ReportExecutionServiceSoapClient设置凭
- 如何在ASP.NET中以编程方式创建子域?
- .net – IDataErrorInfo vs IValidatableObject?
- asp.net – 在IIS中,为什么窗口验证不显示为我的Web应用程序
- asp.net-mvc-4 – 如何在一个Web应用程序中最好地组合Web A
- asp.net – 防止TextBox中的特殊字符
- 【ASP.NET】12.ASP.NET Web开发实现log日志打印
- 用于asp.net应用程序的脚本引擎
- WPF和MVC是相同的概念吗?
- ASP.NET中的<%%>(嵌入式代码块)
- asp.net页面间传值的五种方法
- asp.net-mvc – 将数据动态绑定到asp.net mvc中的
- asp.net-core – 使用ASP.NET Core后端服务器验证
- iis – 将整个经典ASP网站重定向到新域名的最佳方
- asp.net – 如何从WCF客户端拦截raw soap reques
- asp.net – 是存储库单例或静态还是没有这些?
- asp.net – Visual Studio加载项自动附加到Devel
- asp.net-mvc – 过滤Kendo UI MVC Grid时的自定义
- asp.net – 如何崩溃App Pool?
- 如何识别ASP.NET Web表单和ASP.NET MVC网站?