WebAPI OData GetModel带有关键奇怪错误

时间:2016-01-28 17:56:20

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

我只是用Identity创建一个新的WebAPI项目(VS2015),添加了一个简单的测试EF模型,并且支持一个实体(OData v3):

Public Class LanguagesController
    Inherits ODataController

    Private db As New APITestEntities

    ' GET: odata/Languages
    <EnableQuery>
    Function GetLanguages() As IQueryable(Of Language)
        Return db.Languages
    End Function

    ' GET: odata/Languages(5)
    <EnableQuery>
    Function GetLanguage(<FromODataUri> key As Guid) As SingleResult(Of Language)
        Return SingleResult.Create(db.Languages.Where(Function(language) language.ID = key))
    End Function

...

好吧,/odata/Languages返回没有错误的语言列表,但如果我想要一个SingleResult,调用/odata/Languages(GUID),它会返回400 Bad Request错误:

{
  "odata.error": {
    "code": "",
    "message": {
      "lang": "en-US",
      "value": "The request is invalid."
    },
    "innererror": {
      "message": "The parameters dictionary contains a null entry for parameter 'key' of non-nullable type 'System.Guid' for method 'System.Web.Http.SingleResult`1[t.API.Language] GetLanguage(System.Guid)' in 't.API.Controllers.LanguagesController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.",
      "type": "",
      "stacktrace": ""
    }
  }
}

更奇怪的是,如果我用FromODataUri更改FromUri,那就有效了!但是,如果我需要手动更改每个方法,脚手架的重点是什么。

任何人都知道如何解决这个问题?我无法相信这种改变是解决方案。

1 个答案:

答案 0 :(得分:2)

在OData v3中,文字GUID的语法是guid'0308f91a-485f-495f-b725-d92a1f4298f3';也就是说,字符串guid,后跟单引号,后跟GUID数字,后跟单引号。因此,您的请求URI应该看起来像/odata/Languages(guid'0308f91a-485f-495f-b725-d92a1f4298f3')

如果可以,请升级到OData v4。