Web API OData v2忽略额外的客户端属性

Web API OData v2忽略额外的客户端属性,odata,asp.net-web-api2,sapui5,Odata,Asp.net Web Api2,Sapui5,我很好奇有什么选项可以让我忽略从客户端UI(OpenUI5)发送到后端API(ASP.NET Web API OData v1-3)的附加属性 问题 OpenUI5总是随请求一起发送一个附加属性,该属性会导致一个空参数(我通常会有一个增量补丁),以及一个BadRequest响应: { “错误”:{ “代码”:“, “信息”:{ “lang”:“en-US”,“value”:“请求无效。” }, “内部错误”:{ “消息”:“修补程序:类型“Models.Item”上不存在属性“\uuuu me

我很好奇有什么选项可以让我忽略从客户端UI(OpenUI5)发送到后端API(ASP.NET Web API OData v1-3)的附加属性


问题 OpenUI5总是随请求一起发送一个附加属性,该属性会导致一个空参数(我通常会有一个
增量补丁
),以及一个BadRequest响应:

{
“错误”:{
“代码”:“,
“信息”:{
“lang”:“en-US”,“value”:“请求无效。”
},
“内部错误”:{
“消息”:“修补程序:类型“Models.Item”上不存在属性“\uuuu metadata”。请确保仅使用由该类型定义的属性名称。”,
“类型”:“,
“stacktrace”:”
}
}
}
(服务器端)模型/Item.cs

公共部分类应用程序
{
公共字符串属性1{get;set;}
公共字符串属性2{get;set;}
公共字符串属性3{get;set;}
}
我的客户端库正在发送一个
httpmerge
,只更改了一些属性,因此我们可以使用WebAPI的
Delta

我无法控制请求的发送方式(请参阅)。我无法控制这样的出站请求(假设我只更改对象上的Property1和Property2):

合并http://my-api.com/odata/Items(3) 

{
“物业1”:“ABC”,
“属性2”:“定义”,
“_元数据”:{
“id”:”http://my-api.com/odata/Items(3)",
“uri”:http://my-api.com/odata/Items(3)",
“类型”:“Models.Item”
}
}
这几乎正是我想要发送的内容,除了
\uu元数据
对象。我看到一篇类似的帖子,指出正确的方法(在ODataV4中)是允许DynamicProperties()。然而,使用UI5,我目前仅限于v2


问题:
在模型绑定期间,是否可以实现MessageHandler、ModelBinder或其他方法来在传入请求之前剥离
\u元数据
属性?我唯一担心的是MessageHandler将无法修改传入的请求主体,并且由于合并/修补请求中使用的类型是
增量
,因此创建自定义ModelBinder可能很困难。ValueProvider的实现可能很困难,但可以接受建议

您可以创建从原始OData模型继承的新OData模型。 并重写_请求函数

var MyModel = ODataModel.extend("sap.ui.model.rest.MyModel",{
  constructor : function(sServiceUrl, mParameters) {
    ODataModel.apply(this, arguments);
  }
});
MyModel.prototype._request = function(oRequest, fnSuccess, fnError) {
  if (oRequest.data) {
    if (oRequest.data.__metadata) {
      delete oRequest.data.__metadata;
    }
  }
  return ODataModel.prototype._request.apply(this, [oRequest, fnSuccess, fnError]);
};

我喜欢这种方法,因为它让客户端有责任与后端系统一起工作,而不是让后端系统为特定的客户端工作。但是,我对后端的一种方法感兴趣,这种方法可以忽略与预期传入类型不匹配的属性。