我正在将Web服务转换为使用OData。 我已经创建了一个ODataController实现,如下所示:
public class PersonController : ODataController
{
public PersonController()
{
}
public IHttpActionResult Get()
{
return Ok(new Person());
}
public IHttpActionResult Get([FromODataUri] int key)
{
return Ok(new Person());
}
protected override void Dispose(bool disposing)
{
}
}
并注册了这样的模型:
var builder = new ODataConventionModelBuilder();
builder.EntitySet<Person>("Person");
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.MapODataServiceRoute(
routeName: "odata",
routePrefix: "odata",
model: builder.GetEdmModel());
Web应用程序部署没有问题,第一个函数在我调用时起作用:
http://localhost:9200/odata/Customer
->
{
"@odata.context":"http://localhost:9200/odata/$metadata#Person/$entity","Name":"John"
}
但是,调用http://localhost:9200/odata/Customer(1)失败,服务器日志上的跟踪显示找不到路由:
iisexpress.exe Information: 0 : Response, Status=404 (NotFound), Method=GET, Url=http://localhost:9200/odata/Person(1), Message='Content-type='application/xml; charset=utf-8', content-length=unknown'
我在方法上使用ODataRoutePrefix,ODataRoute,EnableQuery尝试了不同的属性排列,到目前为止,我所做的一切似乎都没有帮助。我已经看过的教程说这应该可以工作,所以现在我不知道我应该如何让这个工作。有没有人有任何想法?
答案 0 :(得分:0)
我设法解决了自己的问题。
问题是,实体中定义的Key是String类型。 这意味着FromODataUri提取的密钥也必须是String!
类型在此示例中,可以通过将键更改为String类型或将Person键更改为int类型来解决此问题。