如何在asp.net核心

时间:2018-02-23 13:01:05

标签: c# asp.net-web-api asp.net-core .net-core

我正在将一个应用程序从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?}");
});

我可以使用此网址成功测试操作

  

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" });

});

这将允许我使用两个网址进行测试,但是,我必须为每个控制器添加这样的路由。

任何人都可以帮助我理解为什么它不能像在WebApi 2中那样工作吗?另外,关于如何在不为每个控制器添加全局路由的情况下让两个URL都能在asp.net核心中工作的任何指针?由于我正在移植这个应用程序,我不是100%肯定客户端如何调用我们的api所以我希望两者都可以为可能的向后兼容性工作。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用属性

实现相同的行为
[Route("api/[controller]")]
public class TestController : Controller
{
    [HttpGet("{id}")]
    [HttpGet("verify")]
    [AcceptVerbs("GET")]
    public IActionResult Verify(string id)
    {
        return Ok();
    }
}

这样两个请求都能正常运行,您无需为每个控制器编写routes.MapRoute