OData 4 AspNet:GET参数不起作用

时间:2016-09-07 12:56:15

标签: c# odata

我正在将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尝试了不同的属性排列,到目前为止,我所做的一切似乎都没有帮助。我已经看过的教程说这应该可以工作,所以现在我不知道我应该如何让这个工作。有没有人有任何想法?

1 个答案:

答案 0 :(得分:0)

我设法解决了自己的问题。

问题是,实体中定义的Key是String类型。 这意味着FromODataUri提取的密钥也必须是String!

类型

在此示例中,可以通过将键更改为String类型或将Person键更改为int类型来解决此问题。