未找到与请求URI匹配的操作

时间:2014-07-15 22:16:40

标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-apicontroller

我试图通过允许其中一个参数作为管道分隔的字符串传递来修改我的一个api控制器以允许创建多个预留。方法和类可以在这里看到:

public class ReservationsController : ApiController
{
    public HttpResponseMessage PostReservation(string eRaiderUserName, string SpaceNumbers)
    {
        char[] delimiter = { '|' };
        string[] spaces = SpaceNumbers.Split(delimiter);
        bool saved = true;
        foreach(string space in spaces)
        {
            var reservation = new Reservation { eRaiderUserName=eRaiderUserName, SpaceNumber=Convert.ToInt32(space) };
            if (true)
            {
                reservation.Game = db.Games.FirstOrDefault(g => g.ID == AppSettings.CurrentGameID);
                db.Reservations.Add(reservation);
                db.SaveChanges();

                //HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, reservation);
                //response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = reservation.ID }));
                //return response;
            }
            else
            {
                saved = false;
                //return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }
        }

        db.SaveChanges();
        if (saved)
        {
            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created);
            response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = 1 }));
            return response;
        } else
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }
    }
}

我有一个表单,发布我认为应该是正确的信息,但我不断收到此错误:

{"$id":"1","Message":"No HTTP resource was found that matches the request URI 'http://localhost:58463/api/Reservations'.","MessageDetail":"No action was found on the controller 'Reservations' that matches the request."}

api中的(修改)保存方法仍然是一项正在进行的工作。但是,是什么阻止它找到web api控制器?这是firebug输出:

enter image description here

3 个答案:

答案 0 :(得分:6)

正如所指出的,问题是POST操作只能将正文中发布的数据传输到单个对象(出于技术原因)。

这意味着您可以从路径数据,查询字符串和正文中获取数据,但具有以下限制:

    来自查询字符串或路由数据的
  • 数据必须是单个值(即它们不能是类),任何数字
  • 您只能使用来自请求正文的数据操作的一个参数,但这可能是一个复杂的类
  • 您可以对此进行任意组合,即来自正文的单个或复杂参数,以及来自路径数据或查询字符串的任意数量的单个参数。

因此,解决问题的最通用方法(即可以轻松应用于需要传递复杂数据的其他类,甚至比这种情况更复杂)是:

首先,在您的情况下,创建一个具有所有所需数据属性的类:

public class ReservationData
{
  public string eRaiderUserName { get; set; }
  public string SpaceNumbers  { get; set; }
}

其次,使用此类作为操作中接收参数的类型:

public HttpResponseMessage PostReservation(ReservationData reservationData)

使用此代码,格式化程序可以将请求正文中的所有数据映射到操作中的单个参数。您可以使用JSON或formdata格式,例如jQuery生成的格式。

注意:属性名称必须区分大小写匹配已发布参数的名称。

答案 1 :(得分:0)

这是因为您将x-www-form-urlencoded数据发送到控制器,要处理这些数据,您必须在参数之前使用 [FromBody]

public HttpResponseMessage Post([FromBody] string name) { ... }

但这种方法有很多限制: 1)只能有一个标记[FromBody]属性的参数(它可以是复杂类型) 2)数据必须编码为= value而不是key = value。 您可以在此处阅读description以及如何在此处example进行操作。 如果可能的话,我建议你将Json数据发送给控制器,没有这个限制。

答案 2 :(得分:0)

Web API对将POST表单变量映射到Web API方法的简单参数的支持有限。 Web API不处理多个发布的内容值,您只能将单个内容值发布到Web API Action方法。

public HttpResponseMessage PostReservation(string eRaiderUserName, string SpaceNumbers)

{//...}

并且您正尝试使用jQuery调用:

$.ajax({  url: 'api/reservations', type: 'POST', data: { ... }, dataType: 'json', success: function (data) {alert(data);} }); 

不幸的是,Web API无法处理此请求,您将收到错误消息。但是如果你使用查询字符串传递参数,它将起作用:

$。ajax({url:' api / reservations?eRaiderUserName = 2012& SpaceNumbers = test',type:' POST',dataType:' json' ,success:function(data){alert(data);}});

但这不是好的解决方案,不适用于复杂的对象。所以这里有不同的方法。

  1. 使用模型绑定(首选)
  2. 使用自定义参数绑定
  3. FormDataCollection
  4. 查询字符串