【问题标题】:how to achieve classic webapi 2 routing in asp.net core如何在asp.net core中实现经典的webapi 2路由
【发布时间】: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 成功测试操作

http://localhost/Test/verify?id=tokenstring

但是,以下 URL 会产生 404 错误:

http://localhost/Test/tokenstring

如果我使用属性路由来显式修复损坏的 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


    【解决方案1】:

    您可以使用属性实现相同的行为

    [Route("api/[controller]")]
    public class TestController : Controller
    {
        [HttpGet("{id}")]
        [HttpGet("verify")]
        [AcceptVerbs("GET")]
        public IActionResult Verify(string id)
        {
            return Ok();
        }
    }
    

    这样两个请求都可以正常工作,您不需要为每个控制器编写routes.MapRoute

    【讨论】:

      猜你喜欢
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 2018-08-25
      相关资源
      最近更新 更多