Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 404使用WEB API OData v4调用元数据时出错_.net_Odata_Asp.net Web Api2_Sapui5 - Fatal编程技术网

.net 404使用WEB API OData v4调用元数据时出错

.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.

我使用postman测试了对$metadata的调用,发现当提供MaxDataServiceVersion头时,服务总是返回404错误。我用Breeze发了其他帖子,但是我能找到的最好的答案是注释掉添加此标题的行

我们在客户端应用程序中使用SAPUI5 ODataModel,并指出头不是一个选项

Web API配置:

 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);