【问题标题】:Asp.Net Core WEB API error 404 calling methodAsp.Net Core WEB API报错404调用方法
【发布时间】:2018-05-13 01:26:14
【问题描述】:

我正在尝试在 Web api 上创建一个额外的 Get 方法,但返回的是 404(找不到方法)。

在 Core 之前的 API 中,我创建了这样的方法:

[HttpGet]
[Route("api/MyNewMethodName")]
public object MyNewMethodName(string parameter1)
{}

电话:

myURL/api/MyNewMethodName?parameter1=somestring

在我的控制器定义中,我有:

[Produces("application/json")]
[Route("api/MyController")]
public class MyController : Controller

对于某些代码,我收到 404 错误。

请问有什么问题吗?

【问题讨论】:

  • 你的控制器有前缀装饰器属性吗?
  • 在我的控制器我有:[Produces("application/json")] [Route("api/MyController")] public class MyController : Controller
  • 请更新问题

标签: c# asp.net-core asp.net-core-webapi asp.net-core-routing


【解决方案1】:

你的控制器定义了一个路由。因此,对于您的操作方法,它将是为控制器定义的路由前缀 + 操作方法的路由模式。这意味着,使用您当前的代码,它将适用于以下请求

yourBaseUrl/api/MyController/api/MyNewMethodName?parameter1=somestring

这里api/MyController 部分来自控制器级别的路由定义,api/MyNewMethodName 部分来自操作方法级别。

根据需要在控制器或方法级别修复路由前缀。例如,如果您希望您的操作方法响应 /api/MyNewMethodName?parameter1=somestring。只需删除控制器级别的 Route 装饰器即可。

[Produces("application/json")]
public class MyController : Controller
{
    [HttpGet]
    [Route("api/MyNewMethodName")]
    public object MyNewMethodName(string parameter1)
    {
        return "Sample dummy response : "+parameter1;
    }
}

请记住,删除控制器级别的路由可能会破坏该控制器中其他操作方法的路由。如果您想保留现有路由(使用控制器级别路由属性),您可以更新您的操作方法级别路由模式以以/开始

[Produces("application/json")]
[Route("api/MyController")]
public class MyController : Controller
{
    [HttpGet]
    [Route("/api/MyNewMethodName")]
    public object MyNewMethodName(string parameter1)
    {
        return "Some test"+parameter1;
    }
    [HttpGet]
    [Route("SecondMethod")]
    public object SecondMethod(string parameter1)
    {
        return "SecondMethod : "+parameter1;
    }
}

【讨论】:

  • 好的,您的第一个建议现在可以了,您的第二个建议也可以了。但在第二种情况下,移除 Route 文档,标准的 get 方法不再被路由。
  • @GCoe 在这种情况下,放回路由前缀并更新所需的操作以使用波浪号 (~) 覆盖前缀,即:[Route("~/api/MyNewMethodName")]。参考Routing to Controller Actions in ASP.NET Core参考Routing in ASP.NET Core
  • 以/开头的路由模式也适用于这种情况。
【解决方案2】:

[HttpGet]

[Route("api/[controller]/MyNewMethodName")]

公共对象MyNewMethodName(字符串参数1) {

}

尝试声明上述格式,这对我有用。

【讨论】:

    猜你喜欢
    • 2013-08-16
    • 2019-11-04
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2019-04-27
    • 2020-11-21
    相关资源
    最近更新 更多