为什么让我的 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");
我正在创建一个简单的项目来测试 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");