我只是用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
,那就有效了!但是,如果我需要手动更改每个方法,脚手架的重点是什么。
任何人都知道如何解决这个问题?我无法相信这种改变是解决方案。
答案 0 :(得分:2)
在OData v3中,文字GUID的语法是guid'0308f91a-485f-495f-b725-d92a1f4298f3'
;也就是说,字符串guid
,后跟单引号,后跟GUID数字,后跟单引号。因此,您的请求URI应该看起来像/odata/Languages(guid'0308f91a-485f-495f-b725-d92a1f4298f3')
。
如果可以,请升级到OData v4。