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

问题描述 投票:1回答:1

我正在使用Postman对我的Web API进行POST调用。我收到错误消息:“请求的资源不支持http方法'GET'。”我没有拨打GET电话。如果我确实调用了我的GET方法之一,它可以正常工作并返回预期的结果。

我的控制器类:

[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;
            }
        }        

    }

我有在本地运行的Web API并使用此URL进行调用:

http://localhost:44303/api/login/validate

此网址返回:

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

虽然此控制器消息返回HttpResponseMessage,但我已经通过将响应更改为“字符串”并仅返回字符串值进行了测试,但是我遇到了相同的错误。我已经阅读了很多SO帖子,但似乎都没有解决我的问题。我不知所措以解释这种行为。我感谢任何想法。

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

为内容编辑6/3/2020默认ValuesController中的此方法有效:

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

SAME控制器中的这两种方法不起作用:

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

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

编辑#2 6/3/2020现在,我所有的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。

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

c# asp.net-web-api asp.net-web-api-routing
1个回答
0
投票

您不需要使用HttpMethods创建路由表,因为您具有[HttpPost]属性。

用[替换全部config.Routes.MapHttpRoute

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

最好将属性路由用于Web API项目。这将减少出错的可能性,因为在RouteConfig类中,创建新的自定义路由时可能会出现任何错误。另外,您不必照顾路由流程,即从最具体到最一般的流程。这里所有都是您使用操作方法的属性。

© www.soinside.com 2019 - 2024. All rights reserved.