Web API:所请求的资源不支持HTTP方法“GET”。

12

我在我的MVC4项目上创建了一个API控制器

以下是我创建的用于测试API功能的方法

private string Login(int id)
{
    Employee emp = db.Employees.Find(id);
    return emp.Firstname;
}

当我试图使用localhost:xxxx/api/controllerName/Login?id=2访问此API时,我收到以下错误:

{"$id":"1","Message":"The requested resource does not support http method 'GET'."}

我做错了什么?

另外,这是我的API配置文件:

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

        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
        config.Formatters.Remove(config.Formatters.XmlFormatter);
    }

2
从使该方法公开开始。 - Giorgio Minardi
3
@GiorgioMinardi,请继续使用[HttpGet][AcceptVerbs("GET", "POST")]... - gdoron
@giorgio Minardi,@gdoron Oh。谢谢你们。我的错。很抱歉用一些如此微不足道的东西打扰了社区。现在它可以工作了,但我希望它以d格式“Firstname:john”的形式给我结果。它只给出“john”。这是正常行为吗? - ylinkz
它返回“john”,因为你返回了一个字符串,所以你得到了一个JSON序列化的字符串。如果你想要一个带有属性FirstName的对象,你需要返回一个具有该属性的对象。 - Mike Wasson
3个回答

23

将方法的修饰符从private改为public,同时在操作中添加相关的接受动词

private string Login(int id)

更改为:

[HttpGet] // Or [AcceptVerbs("GET", "POST")]
public string Login(int id)

我的方法被分类为“public”,但我仍然遇到了这个错误。 - Pranesh Janarthanan
@Vijayaraghavan 发布你的代码,如果没有人帮助你,你可以联系我。我相信你会在几分钟内得到答案。 - gdoron
1
问题已解决,我将 API 域名托管在 HTTP 下而不是 HTTPS 下。以前的 API 是使用虚拟 SSL 证书托管的。这可能是原因。等待您的建议。 - Pranesh Janarthanan

3

除了当前接受的答案,即添加[HttpGet]属性以使方法公开外,您还需要确保使用正确的命名空间:

  • MVC控制器使用System.Web.Mvc
  • WebAPI控制器使用System.Web.Http

谢谢,这帮助我解决了问题,我花了几个小时才弄清楚为什么它没有触发我的控制器。 - Himanshu Chopra

3
您可以在web.config文件的system.webserver标签中接受http方法:
<httpProtocol>
   <customHeaders>
      <clear />
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
      <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
   </customHeaders>
</httpProtocol>

1
我不确定这与问题有关。 这些标头将CORS信息添加到响应中。 它们指定客户端在进行CORS请求时可能被允许使用哪些HTTP方法。 然而,MVC方法是在服务器端管理的。https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS - Danny R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接