【发布时间】:2018-08-03 13:11:10
【问题描述】:
我正在将一个应用程序从 asp.net webapi 2 移植到 asp.net core,我发现了一个我似乎无法解决的路由问题。
我有一个这样的 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 });
有了这个控制器,我可以用这两个 url 测试资源
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 成功测试操作
但是,以下 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" });
});
这将允许我使用两个 url 进行测试,但是,我必须为每个控制器添加这样的路由。
谁能帮我理解为什么这不能像在 WebApi 2 中那样工作?此外,关于如何让两个 url 在 asp.net 核心中工作而不为每个控制器添加全局路由的任何指针?由于我正在移植此应用程序,因此我不能 100% 确定客户端如何调用我们的 api,因此如果可能,我希望两者都为向后兼容而工作。
谢谢!
【问题讨论】:
标签: c# asp.net-web-api asp.net-core .net-core