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



我正在使用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 默认值控制器中的此方法有效:

[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 6/3/2020 现在我所有的 api 方法都适用于默认的值控制器。我不知道为什么。 我在其他控制器(例如上面的 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 创建路由表,因为您具有[HttpPost]属性。

将所有config.Routes.MapHttpRoute替换为

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

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

最新更新