ASP.NET Web API - 请求的资源不支持 http 方法 'GET'

ASP.NET Web API - The requested resource does not support http method 'GET'

我正在使用 Postman 使 POST 调用我的 Web API。我收到错误:"The requested resource does not support http method 'GET'." 我没有拨打 GET 电话。如果我确实调用了我的 GET 方法之一,它工作正常并且 returns 预期结果。

我的控制器class:

[RoutePrefix("api/login")]
    public class LoginController : ApiController
    {
        ModelContext db = new ModelContext();

        [HttpPost]
        [Route("validate")]
        public HttpResponseMessage Validate([FromBody] LoginViewModel login)
        {
            try
            {

                    var message = Request.CreateResponse(HttpStatusCode.OK);
                    return message;
            }
            catch (Exception ex)
            {
                var message = Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
                return message;
            }
        }        

    }

我在本地有网络 API 运行 并用这个 URL:

打电话
http://localhost:44303/api/login/validate

这个urlreturns:

<Error>
<Message>
The requested resource does not support http method 'GET'.
</Message>
</Error>

我的路线在WebApiConfig.cs

config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

虽然此控制器消息 returns HttpResponseMessage,但我通过将响应更改为 "string" 并仅返回一个字符串值进行了测试,但我得到了同样的错误。 我已经阅读了很多 SO 帖子,但 none 似乎解决了我的问题。我完全无法解释这种行为。我很欣赏任何想法。

编辑 我在其他控制器中测试了 GET,它们按预期返回数据。

编辑上下文 6/3/2020 此方法在默认 ValuesController 中有效:

[Route("api/values")]
public IEnumerable<string> Get()
{
   return new string[] { "value1", "value2" };
}

SAME 控制器中的这 2 个方法不起作用:

// GET api/values/5
public string Get(int id)
{
  return "value";
}

// POST api/values
public void Post([FromBody]string value)
{
}

编辑 #2 2020 年 6 月 3 日 现在我的所有 api 方法都适用于默认的 ValuesController。我不知道为什么。 我在其他控制器中的自定义 POST 方法(例如上面的 Post 方法)仍然无法正常工作。这是我目前的 WebApiConfig.cs:

public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "Api_Get",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional, action = "Get" },
                constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
            );

            config.Routes.MapHttpRoute(
                name: "Api_Post",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional, action = "Post" },
                constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) }
            );
        }

我不知道任何中间件或特殊路由。任何异常处理都是简单的 try-catch。

我正在尝试使用属性路由与约定,但这似乎是个问题。

您不需要通过 HttpMethods 创建路由 table,因为您具有 [HttpPost] 属性。

将所有config.Routes.MapHttpRoute替换为

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

Web API 项目最好使用属性路由。这将减少出错的机会,因为在 RouteConfig class 中创建新的自定义路由时可能会出现任何错误。此外,您不必处理路由流程,即从最具体到最一般。这里都是你使用action方法的属性。