我正在将一个应用程序从asp.net webapi 2移植到asp.net核心,我发现了一个我似乎无法弄清楚路由的问题。
我有一个像这样的WebApi 2控制器:
namespace Sopost.Controllers
{
using System.Net;
using System.Net.Http;
using System.Web.Http;
public class TestController : ApiController
{
[HttpGet]
[AcceptVerbs("GET")]
public HttpResponseMessage Verify(string id)
{
return new HttpResponseMessage(HttpStatusCode.OK);
}
}
}
路线映射如下:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
使用此控制器,我可以使用这两个网址
测试资源http://localhost/api/Test/Verify?id=tokenString http://localhost/api/Test/tokenstring
在ASP.NET Core 1.1应用程序中,我使用以下内容:
namespace Sopost.Controllers
{
using Microsoft.AspNetCore.Mvc;
public class TestController : Controller
{
[HttpGet]
[AcceptVerbs("GET")]
public IActionResult Verify(string id)
{
return Ok();
}
}
}
使用此映射:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
我可以使用此网址成功测试操作
但是,以下URL会产生404错误:
如果我使用属性路由来明确修复损坏的URL的路由,则其他URL会中断。
修改 我在这里找到了一个工作asp.net routing syntax with no action ,现在我的startup.cs看起来像这样:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "testroute",
template: "test/{id}",
defaults: new { controller = "Test", action = "Verify" });
});
这将允许我使用两个网址进行测试,但是,我必须为每个控制器添加这样的路由。
任何人都可以帮助我理解为什么它不能像在WebApi 2中那样工作吗?另外,关于如何在不为每个控制器添加全局路由的情况下让两个URL都能在asp.net核心中工作的任何指针?由于我正在移植这个应用程序,我不是100%肯定客户端如何调用我们的api所以我希望两者都可以为可能的向后兼容性工作。
谢谢!
答案 0 :(得分:0)
您可以使用属性
实现相同的行为[Route("api/[controller]")]
public class TestController : Controller
{
[HttpGet("{id}")]
[HttpGet("verify")]
[AcceptVerbs("GET")]
public IActionResult Verify(string id)
{
return Ok();
}
}
这样两个请求都能正常运行,您无需为每个控制器编写routes.MapRoute