【问题标题】:WebApi 2 and OData controller - cast exception during route configuration, GetEdmModel not understoodWebApi 2 和 OData 控制器 - 在路由配置期间投射异常,GetEdmModel 不理解
【发布时间】:2015-09-19 04:09:18
【问题描述】:

我有一个我已经构建的控制器(从 System.Web.Http.Odata.ODataController 扩展),我认为它可以正常工作 - 它主要基于我的 Visual Studio IDE 提供的纯脚手架。

应用程序将构建,但在应用程序启动期间出错。当它执行初始路由配置时,它在我的 App_Start 文件夹中此 WebApiConfig 类的最后一行失败 - 对 config.MapODataServiceRoute 的调用会引发 InvalidCastException,因为无法理解 builder.GetEdmModel() 的值:

Imports System.Web.Http
Imports System.Web.Http.Cors
Imports System.Web.Http.OData.Builder
Imports System.Web.OData.Extensions

Public Class WebApiConfig
    Public Shared Sub Register(ByVal config As HttpConfiguration)
    ' Web API configuration and services

    'enable cross orgin scripting 'CORS'
    Dim cors = New EnableCorsAttribute("*", "*", "*")
    config.EnableCors(cors)

    ' Web API routes
    config.MapHttpAttributeRoutes()

    config.Routes.MapHttpRoute(
        name:="DefaultApi",
        routeTemplate:="api/{controller}/{id}",
        defaults:=New With {.id = RouteParameter.Optional}
    )


    Dim builder As New ODataConventionModelBuilder
    builder.EntitySet(Of BusinessOrder)("BusinessOrder")
    config.MapODataServiceRoute("odata", Nothing, builder.GetEdmModel())
    End Sub
End Class

这里是 InvalidCastException 的具体语言:

Unable to cast object of type 'Microsoft.Data.Edm.Library.EdmModel' to type 'Microsoft.OData.Edm.IEdmModel'.

嗯.. ODataConventionModelBuilderMapODataServiceRoute 的文档似乎表明我正在处理兼容类型。如果我没看错,我会从对 GetEdmModel 的调用中返回一个 Microsoft.Data.Edm.Library.EdmModel 的实例,根据文档,我认为它应该符合 IEdmModel 接口。

这是我的网络应用程序的 NuGet packages.config - 希望这可以帮助您了解我的网络应用程序引用的库:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Antlr" version="3.4.1.9004" targetFramework="net45" />
  <package id="EntityFramework" version="6.1.3" targetFramework="net45" />
  <package id="jQuery" version="1.10.2" targetFramework="net45" />
  <package id="jQuery.UI.Combined" version="1.11.4" targetFramework="net45" />
  <package id="jQuery.Validation" version="1.11.1" targetFramework="net45" />
  <package id="knockoutjs" version="2.3.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Cors" version="5.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.OData" version="5.6.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Cors" version="5.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.OData" version="5.5.1" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net45" />
  <package id="Microsoft.Data.Edm" version="5.6.0" targetFramework="net45" />
  <package id="Microsoft.Data.OData" version="5.6.0" targetFramework="net45" />
  <package id="Microsoft.OData.Core" version="6.11.0" targetFramework="net45" />
  <package id="Microsoft.OData.Edm" version="6.11.0" targetFramework="net45" />
  <package id="Microsoft.Spatial" version="6.11.0" targetFramework="net45" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
  <package id="Modernizr" version="2.6.2" targetFramework="net45" />
  <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net45" />
  <package id="System.Spatial" version="5.6.0" targetFramework="net45" />
  <package id="WebGrease" version="1.5.2" targetFramework="net45" />
</packages>

【问题讨论】:

  • 感谢@TomOrton 在下面的说明中显示了使用 OData v3 和 v4 时的 b/t 差异。我确信这是我的问题的部分,即使它没有立即解决我的问题。我决定通过运行以下命令来升级我的 NuGet 引用之一:Update-Package Microsoft.OData.Core(它将 6.11.0 的 3 个包升级到 6.12.0),这似乎缓解了我的困境。

标签: asp.net-web-api odata odata-v4


【解决方案1】:

您正在混合使用不同版本的 OData。命名空间 System.Web.Http.OData 用于 v3,命名空间 System.Web.OData 用于 v4。

Imports System.Web.Http.OData.Builder
Imports System.Web.OData.Extensions 

我不知道您尝试使用哪个版本,但它应该是一致的。尝试将两者都更改为 Http

Imports System.Web.Http.OData.Builder
Imports System.Web.Http.OData.Extensions 

或两者都没有 Http

Imports System.Web.OData.Builder
Imports System.Web.OData.Extensions 

【讨论】:

  • 我更改了我的 WebApiConfig.vb Imports 以及我的 api 控制器类的 Imports 语句,但解决方案仍然挂在同一行。相同的错误信息。也许我需要清理我的 NuGet 包引用?
  • 这听起来是个好主意,你应该可以通过更改命名空间等来实现它,但这可能是最快的方法,因为如果没有移动任何东西它会出错.告诉我进展如何!
  • 顺便说一句,我正在尝试使用版本 4.. 最初,当我搭建我的 api 控制器时 - 它给了我一些代码来放入 WebApiConfig,(特别是config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel()))当我去粘贴这个建议的代码 sn-p,Intellisense 告诉我它已经过时了。那时我将过时的方法调用更改为建议的扩展方法MapODataServiceRoute,这显然是 OData v 4
  • 我对这个答案投了“赞成票”,因为它很有帮助,但是它并没有完全解决我的问题。查看我对我的 OP 的评论
【解决方案2】:

我决定通过运行以下命令升级我的 NuGet 引用之一:Update-Package Microsoft.OData.Core(它将 6.11.0 的 3 个包升级到 6.12.0)

【讨论】:

    猜你喜欢
    • 2018-01-17
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多