.net 404使用WEB API OData v4调用元数据时出错
我使用postman测试了对$metadata的调用,发现当提供MaxDataServiceVersion头时,服务总是返回404错误。我用Breeze发了其他帖子,但是我能找到的最好的答案是注释掉添加此标题的行 我们在客户端应用程序中使用SAPUI5 ODataModel,并指出头不是一个选项 Web API配置:.net 404使用WEB API OData v4调用元数据时出错,.net,odata,asp.net-web-api2,sapui5,.net,Odata,Asp.net Web Api2,Sapui5,我使用postman测试了对$metadata的调用,发现当提供MaxDataServiceVersion头时,服务总是返回404错误。我用Breeze发了其他帖子,但是我能找到的最好的答案是注释掉添加此标题的行 我们在客户端应用程序中使用SAPUI5 ODataModel,并指出头不是一个选项 Web API配置: ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<TBLMATERIAL>("TBLMATERIALs").EntityType.HasKey(o => o.MaterialNumber);
config.MapODataServiceRoute(
routeName: "ODataRoute",
routePrefix: null,
model: builder.GetEdmModel());
您不能将ODataV4与SAPUI5一起使用。SAPUI5提供了一个v4数据模型类(
sap.ui.model.odata.v4.ODataModel
),这是一种误导,即使在2019年底,它也还没有准备好生产。也就是说,您不能使用v4.ODataModel发送任何自定义头,这将是身份验证机制的关键。据我所知,任何软件公司都使用v2模型(sap.ui.model.odata.v2
)与sap和/或中间件服务进行通信
您得到的404错误是SAPUI5将带有特定v2头的请求发送到v4 API的结果。正如其他人在其评论中所述,MaxDataServiceVersion就是这些标题之一。DataServiceVersion是另一个版本。在OData v4中,这些标题已被具有完全不同名称的标题所取代(OData版本、OData MaxVersion)
实际上,我已经花了很长的时间试图截取和修改这些头文件,并在SAPUI5的v2模型和.NET的v4模型之间建立通信。但最后我失败了,浪费了很多时间
底线
如果要与SAPUI5通信,请在.Net Framework WebApi中使用OData v2
为此,您必须使用5.x版的ODataNuGet包Microsoft.AspNet.WebApi.OData。此软件包支持ODatav1到v3
您可以不使用版本号为7.x的最新OData Nuget软件包Microsoft.AspNet.OData。此软件包仅支持OData v4,不会让您满意
如果您使用的是.Net Core,那么除了使用OData v4,您别无选择。OData v2没有支持.Net Core的Nuget包。在这个场景中,您唯一的解决方案是使用v4服务器端,并在SAPUI5中使用普通JSON模型REST API请求来读/写它。您将在该方法中使用方便性和功能性,但这是可以做到的。在NET Core或NET 5(OData v4)中,$metadata端点似乎是这样创建的 https://localhost:5001/odata/$metadata#船舶 而在Asp.NET(ODataV2)中是这样的
https://localhost:5001/odata/Ship?$metadata您是否尝试在模型上使用maxDataServiceVersion选项?maxDataServiceVersion的最大值是多少?客户端请求的版本是否与服务器提供的版本同步?伪:如果客户端(MaxVersion)>服务器(MaxVersion)=>HTTP404Hi。你有没有找到解决办法?
var oModel = sap.ui.model.odata.v2.ODataModel("http://localhost:56720/");
oModel.attachMetadataFailed(null, function(a,b,c){
alert(a);
}, null);
oModel.attachMetadataLoaded(null, function(){
debugger;
var oMetadata = oModel.getServiceMetadata();
console.log(oMetadata);
},null);