为什么让我的 ODataController 有一个复数名称会阻止它工作

Why would an making my ODataController have a plural name stop it from working

我正在创建一个简单的项目来测试 Entity Framework 中的功能。在前端,我想要一个使用 OData API 与服务器交互的 SPA 应用程序。我如下设置我的第一个 ODataController

public class BlogPostsController : ODataController
{
    private readonly IBlogPostService _blogPostService;

    public BlogPostsController(
        IBlogPostService blogPostService)
    {
        _blogPostService = blogPostService;
    }

    [HttpGet]
    [EnableQuery]
    public IQueryable<BlogPost> GetBlogPosts()
    {
        return _blogPostService.Queryable();
    }

    [EnableQuery]
    public SingleResult<BlogPost> GetBlogPost([FromODataUri] int key)
    {
        return SingleResult.Create(_blogPostService.Queryable().Where(bp => bp.Id == key));
    }
}

我的 ODataConfig 设置如下

public static class ODataConfig
{
    public static void Register(HttpConfiguration config)
    {
        var builder = new ODataConventionModelBuilder();
        builder.EntitySet<Entities.BlogPost>(typeof(Entities.BlogPost).Name);
        config.Routes.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
        config.AddODataQueryFilter();
    }
}

我的网站托管在我机器上的 IIS 中,当我访问 http://localhost/mytestsite/odata/BlogPosts I get a 404. However, if I change my code to change my controller to replace BlogPosts with BlogPost, then I can access the url http://localhost/mytestsite/odata/BlogPost 时,一切都按预期工作。我的工作控制器在下面

public class BlogPostController : ODataController
{
    private readonly IBlogPostService _blogPostService;

    public BlogPostController(
        IBlogPostService blogPostService)
    {
        _blogPostService = blogPostService;
    }

    [HttpGet]
    [EnableQuery]
    public IQueryable<BlogPost> GetBlogPost()
    {
        return _blogPostService.Queryable();
    }

    [EnableQuery]
    public SingleResult<BlogPost> GetBlogPost([FromODataUri] int key)
    {
        return SingleResult.Create(_blogPostService.Queryable().Where(bp => bp.Id == key));
    }
}

另一个问题是,如果我尝试访问 http://localhost/FourTen.Blog.Web/odata/blogpost,我也会收到 404。唯一的区别是 URL 中的博文是小写的。

我的问题是,我是否遗漏了一些命名约定?为什么 URL 区分大小写?

我做了更多的挖掘,并根据这篇文章 http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-routing-conventions,我没有遵循正确的命名约定。我的实体是一个 BlogPost,所以我需要一个 BlogPostController。

它不起作用的原因是您的配置。 您使用名称 BlogPost 注册您的 EntitySet 如果您将其替换为 BlogPosts 它应该可以工作。

builder.EntitySet<Entities.BlogPost>(typeof(Entities.BlogPost).Name);

builder.EntitySet<Entities.BlogPost>("BlogPosts");