【发布时间】:2019-06-08 14:03:29
【问题描述】:
我是新手,关注这个.Net ASP.NET wep api tutorial,但无法克服这个错误。在执行“测试 GetTodoItems 方法”并运行 Postman 以获取/设置数据库时。
当我开始调试时,Chrome 会启动并抛出以下错误:
System.InvalidOperationException: '发生以下错误 属性路由信息:
错误 1:对于操作:'TodoApi.Controllers.TodoController.GetTodoItems (TodoApi)' 错误:在处理模板 'api/[TodoController]' 时,一个 找不到令牌“TodoController”的替换值。 可用令牌:“动作,控制器”。使用 '[' 或 ']' 作为 路由或约束中的文字字符串,使用 '[[' 或 ']]' 而是。
错误 2:对于操作:'TodoApi.Controllers.TodoController.GetTodoItem (TodoApi)' 错误:处理模板时 'api/[TodoController]/{id}',令牌的替换值 找不到“TodoController”。可用令牌:'动作, 控制器'。在路由中使用 '[' 或 ']' 作为文字字符串或 在约束内,请改用 '[[' 或 ']]'。'
这是我直接来自教程的控制器代码:
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using TodoApi.Models;
namespace TodoApi.Controllers
{
[Route("api/[TodoController]")]
[ApiController]
public class TodoController : ControllerBase
{
private readonly TodoContext _context;
public TodoController(TodoContext context)
{
_context = context;
if (_context.TodoItems.Count() == 0)
{
// Create a new TodoItem if collection is empty,
// which means you can't delete all TodoItems.
_context.TodoItems.Add(new TodoItem { Name = "Item1" });
_context.SaveChanges();
}
}
// GET: api/Todo
[HttpGet]
public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems()
{
return await _context.TodoItems.ToListAsync();
}
// GET: api/Todo/5
[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
{
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null)
{
return NotFound();
}
return todoItem;
}
}
}
这里是startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using TodoApi.Models;
namespace TodoApi
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the
//container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<TodoContext>(opt =>
opt.UseInMemoryDatabase("TodoList"));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
// This method gets called by the runtime. Use this method to configure the HTTP
//request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
// The default HSTS value is 30 days. You may want to change this for
// production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseMvc();
}
}
}
【问题讨论】:
-
遇到什么问题喜欢分享一下。
-
顺便说一下,那个教程没有有那个代码。当您所遵循的教程/书籍似乎不起作用时,您应该仔细检查您的代码是否真正匹配。
-
现在图片(完美显示发生在哪里、发生了什么)已经消失,所以错误出现在 startup.cs 的第 46 行,如
app.UseMvc(); -
@ExocetKid 不,该行仅确保您配置的内容是正确的,并且,正如异常告诉您的那样,有些地方不正确。那条线本身没有任何问题
-
@ExocetKid 错误发生在那里,因为那是它生成所有路由并将它们添加到路由表的时候..
标签: c# asp.net-core