WebApi OData属性路由内容协商

时间:2015-05-04 18:34:48

标签: c# asp.net-web-api odata nuget-server asp.net-web-api-odata

我试图模仿NuGet.org的行为,该行为返回一个示例网址的包ID,如:

http://www.nuget.org/api/v2/Packages(Id='Nuget.Core',Version='2.8.3')/Id

此回复如下:

<d:Id xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  Nuget.Core
</d:Id>

我可以使用PropertyRoutingConvention创建一个类似的WebApi OData路由,并在我的控制器上创建一个方法:

public IHttpActionResult GetId([FromODataUri] string id, [FromODataUri] string version)
{
    var package = Repository.FindPackage(id, new SemanticVersion(version));

    return Ok(package.Id);
}

调用此操作但响应始终具有application-type of application / json:

curl -i -q -H 'Accept: application/atom+xml' http://localhost:9001/api/odata/Packages(Id='Nuget.Core',Version='2.8.3')/Id

HTTP/1.1 200 OK
Content-Type: application/json; odata=minimalmetadata; streaming=true; charset=utf-8
DataServiceVersion: 3.0

{
  "odata.metadata":"http://localhost:9001/api/odata/$metadata#Edm.String","value":"Nuget.Core"
}

除了内容协商不起作用外,如何在响应中包含属性名称,使其行为与NuGet.org的行为一样?

为清楚起见,https://github.com/themotleyfool/NuGet.Lucene

提供了完整的代码

1 个答案:

答案 0 :(得分:0)

你的意思是有一个键值对作为回应吗?为什么不返回Ok(包),那么响应中的值将具有

"ID":"Nuget.Core"