WebApi 2 和 OData 控制器 - 在路由配置期间抛出异常,不理解 GetEdmModel
WebApi 2 and OData controller - cast exception during route configuration, GetEdmModel not understood
我有一个自己构建的控制器(从 System.Web.Http.Odata.ODataController 扩展而来),我认为它会正常工作 - 它主要基于我的 Visual Studio [=32= 提供的纯脚手架].
应用程序将构建,但在应用程序启动期间出错。当它执行初始路由配置时,它在我的 App_Start 文件夹中此 WebApiConfig class 的最后一行失败 - 对 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'.
嗯.. ODataConventionModelBuilder and MapODataServiceRoute 的文档似乎表明我正在处理兼容类型。如果我没看错,我会从对 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>
您正在混合使用 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
我决定升级我的一个 NuGet 引用,通过 运行 这个命令:Update-Package Microsoft.OData.Core(将 6.11.0 的 3 个包升级到 6.12.0)
我有一个自己构建的控制器(从 System.Web.Http.Odata.ODataController 扩展而来),我认为它会正常工作 - 它主要基于我的 Visual Studio [=32= 提供的纯脚手架].
应用程序将构建,但在应用程序启动期间出错。当它执行初始路由配置时,它在我的 App_Start 文件夹中此 WebApiConfig class 的最后一行失败 - 对 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'.
嗯.. ODataConventionModelBuilder and MapODataServiceRoute 的文档似乎表明我正在处理兼容类型。如果我没看错,我会从对 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>
您正在混合使用 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
我决定升级我的一个 NuGet 引用,通过 运行 这个命令:Update-Package Microsoft.OData.Core(将 6.11.0 的 3 个包升级到 6.12.0)