【问题标题】:Issue invoking asp.net web api DELETE from jqgrid从 jqgrid 调用 asp.net web api DELETE 的问题
【发布时间】:2014-05-19 07:44:42
【问题描述】:

我正在尝试从 jqGrid 调用 ASP.net WEB API 的 DELETE 方法。但是我收到消息 - “错误状态:'方法不允许'。错误代码:405”

以下是详细信息。

JQGrid 代码-

 $("#employeeSalarysGrid").jqGrid('navGrid', '#employeeSalarysPager',
            {
                add: true,
                edit: true,
                del: true
            },
            editOption,
            addOption,
            delOption);

var delOption = {
        caption: "Delete",
        msg: "Delete selected record(s)?",
        bSubmit: "Delete", bCancel: "Cancel",
        mtype: "DELETE",
        url: 'http://localhost:50570/api/Test/'
    };

ASP.NET Web API 方法:

public HttpResponseMessage Delete(string id)
{
    //code for processing delete request
}

我已经跟踪了使用 Fiddler 发送的请求。以下是请求详情:

DELETE http://localhost:50570/api/Test HTTP/1.1
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost:53055/Views/Test.aspx
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Host: localhost:50570
Content-Length: 13
Connection: Keep-Alive
Pragma: no-cache

oper=del&id=2

请注意参数 Id=2 是在请求​​正文中发送的,而不是查询字符串,我认为应该没问题。

请让我知道您对删除方法没有被调用的原因的看法。

【问题讨论】:

    标签: jquery ajax asp.net-web-api jqgrid


    【解决方案1】:

    由于您使用简单类型(字符串)作为方法参数,Web API 无法路由请求。像这样在 URI 中设置 id - http://localhost:50570/api/Test/123。或者,将参数更改为复杂类型(类),Web API 将开始正确路由,将主体绑定到操作方法参数。

    【讨论】:

    【解决方案2】:

    您应该从 DELETE 请求中删除正文并在 URL 末尾附加 id。 The answer(或this old one)描述了实现细节。我强烈建议您从您使用和使用的 URL 中删除 http://localhost:50570 前缀,例如 url: '/api/Test/' 而不是 url: 'http://localhost:50570/api/Test/'。 Ajax 的限制见here

    【讨论】:

    • 谢谢奥列格。您建议的更改有所帮助,但是方法仍未被调用,并且显示的错误是 - “错误状态:'未找到'。错误代码:404”。当我将 url 提供为 'localhost:50570/api/Test/Delete' + encodeURIComponent(postdata) 时,它会被调用。 asp.net web api签名有问题吗?注意:删除 url 前缀也无济于事。
    • @Abhilash:由于安全原因,如果您从 URL 为 http://localhost:50570/... 的站点发出请求,则 Ajax 请求将失败。因此,通常使用/api/Test/' 之类的 URL。如果您收到“未找到”错误,那么您可以使用 IE 或 Chrome 的开发者工具(按 F12 开始)、网络选项卡来跟踪 HTTP 请求。然后您会看到 URL 实际使用 的差异(比较非工作 URL /api/Test/Deleteapi/Test/Delete 情况与工作 http://localhost:50570/api/Test/Delete/')。我建议找到一个有效的修复或相对 URL。
    • 这是一个问题。但主要问题是我需要在 URL 中提及“/Delete/”。 URL 'localhost:50570/api/Test/123' with mtype: "DELETE" 不会调用 Delete web API 方法,而是我需要提供 URL 为 'localhost:50570/api/Test/Delete/123'。
    • @Abhilash:我不确定您目前遇到的问题。您没有指定使用了哪一个 ASP.NET Web API 以及使用了哪一个路由。可能您应该添加[HttpDelete][Route("api/Test")] 属性来修复路由问题。您应该将客户端问题与服务器端问题分开。 如果 Fiddler 显示 jqGrid 向正确的 URL 发送正确的 DELETE 请求,那么您的客户端问题已经解决。 您应该检查您的服务器端(例如 ASP.NET 应用程序内部的路由)以解决您的其他问题。
    • 谢谢,想通了。问题出在 WebApiConfig.cs。
    猜你喜欢
    • 2012-07-29
    • 2021-01-10
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    相关资源
    最近更新 更多