关于c#:带有Web Api的jQuery-甚至没有调用Controller方法

jQuery put with WebApi - Not even calling the Controller method

很抱歉在提出另一个问题后不久就问这个问题,但是我现在正为PUT苦苦挣扎。

我有一个jQuery方法,它收集数据并将其传递给valuescontroller中的PUT函数。但是控制器甚至都没有被调用(因为我有一个断点并且它没有断)

我可以检查一下我的jQuery是否正确吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var data = {
            id: truckId,
            obj: {
                TruckId: truckId,
                Reg: reg,
                Description: desc,
                Condition: condition
            }
        };
        var json = JSON.stringify(data)

        $.ajax({
            url: '/api/Values',
            type: 'PUT',
            contentType:"application/json; charset=utf-8",
            data: json,
            success: function (results) {
                $.getJSON("api/Values", LoadTrucks);
                alert('Truck Updated !');
            }
        })

控制器如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
public void Put(int id, TruckInfo obj)
    {
        WebApiTestEntities db = new WebApiTestEntities();

        var data = from item in db.TruckInfoes
                   where item.TruckId == id
                   select item;
        TruckInfo oldRecord = data.SingleOrDefault();
        oldRecord.Reg = obj.Reg;
        oldRecord.Description = obj.Description;
        oldRecord.Condition = obj.Condition;
        db.SaveChanges();
    }

现在在我看来,至少应该到达控制器。我的猜测是参数传递不正确,因此它正在寻找不同的方法,但是我看不到为什么或如何纠正它。

任何帮助将不胜感激 :)

莱克斯

编辑:根据要求,更多信息。

错误控制台上没有Javascript错误。

控制台日志显示以下内容:

{" Message":"未找到与请求URI'localhost:62997 / api / Values'匹配的HTTP资源。"," MessageDetail":"在与请求匹配的控制器'Values'上未找到任何操作。"}

在JSON控制台的MessageDetail下,我得到了这个(我认为这支持我关于错误参数的理论)

"在与请求匹配的控制器"值"上未找到任何操作"

但是获取成功。 (还有今天早上我上班的POST。)


如下更改代码,即可正常工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var data = {
        TruckId: truckId,
        Reg: reg,
        Description: desc,
        Condition: condition
    };

var json = JSON.stringify(data)

$.ajax({
    url: '/api/Values/' + truckId,
    type: 'PUT',
    contentType:"application/json; charset=utf-8",
    data: json,
    success: function (results) {

    }
})

使用REST的最佳实践是:

  • 创建新资源时的用户POST。
  • 更新现有资源时的用户PUT,资源ID应在URL中。
  • 删除现有资源时,用户DELETE也应在查询字符串中包含资源ID。

  • 您正在执行PUT请求而未指定对象的ID。

    看这里。

    the URI in a PUT request identifies the entity enclosed with the
    request

    更改

    1
    2
    url: '/api/Values',
    type: 'PUT',

    1
    2
    url: '/api/Values/' + truckId,
    type: 'PUT',

    路由引擎将需要id来匹配您的方法

    1
    public void Put(int id, TruckInfo obj)

    目前,您正在尝试将其放在此处的模型中:

    1
    2
    3
    4
    id: truckId,
    obj: {
       TruckId: truckId,
       //etc

    但这是行不通的。从请求的主体中只能反序列化一个对象。

    只需将您的消息有效负载更改为此

    1
    2
    3
    4
    5
    6
    var data = {
                TruckId: truckId,
                Reg: reg,
                Description: desc,
                Condition: condition
               }

    并使用正确的网址结构,例如:

    1
    PUT http://localhost:62997/api/Values/1


    将以下配置添加到您的web.config文件中

    1
    2
    3
    4
    5
    <system.webServer>
        <handlers>
         
        </handlers>
      </system.webServer>

    您可以使用Firebug或类似的浏览器插件来检查发出的请求和服务器给出的响应。

    IIS也可能拒绝PUT动词。我遇到了同样的问题。如果是这种情况,您应该能够通过在web.config文件(第节)中更改或添加以下处理程序来对其进行修复:

    1
    2
    3
    4
    5
    6
    7
    8
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
     
     
     
    </handlers>