来自web api的POST方法没有被调用。

时间:2013-10-23 13:26:12

标签: asp.net-mvc-4 http-post asp.net-web-api

我正在尝试从web api(在MVC4项目中创建)调用POST方法,但无法访问它。

我的网络API配置如下,

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

我正在尝试调用以下方法,

    [HttpPost]
    public bool Delete(Int64 Id)
    {           
        return true;
    }

所有GET方法都被调用。

当我尝试访问它时,浏览器正在显示,

“不允许使用http 405方法”

当看到响应时,它显示为,

{“消息”:“请求的资源不支持http方法'GET'。”}

请帮帮我。

1 个答案:

答案 0 :(得分:4)

  

当我尝试访问它时,浏览器正在显示

嗯,这很正常。浏览器发送GET请求。您的方法只能通过POST请求调用。

以下是HTTP请求示例的样子:

POST /someresource/delete/123 HTTP/1.1
Host: www.example.com
Content-Type: application/json
Content-Length: 0
Connection: close

您可以在Fiddler中尝试请求,也可以编写一个发送POST请求的示例HTTP客户端。

啊,顺便说一下,为什么不坚持标准的RESTful约定:

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

和你的行动:

public bool Delete(Int64 Id)
{           
    return true;
}

并调用它:

DELETE /someresource/123 HTTP/1.1
Host: www.example.com
Content-Type: application/json
Content-Length: 0
Connection: close

请注意,标准RESTful约定规定不应在路由中使用操作名称。 HTTP动词决定要调用哪个动作。因此,您的操作应根据HTTP谓词进行相应命名。在您的示例中,您希望删除具有指定标识的某些资源,因此您的控制器操作应命名为Delete(因为它当前),并且应该可以通过DELETE HTTP谓词访问它。