无法使用具有多个参数的 MVC Web Api HttpPost 修饰操作

Posted

技术标签:

【中文标题】无法使用具有多个参数的 MVC Web Api HttpPost 修饰操作【英文标题】:Unable to consume MVC WebApi HttpPost decorated action with mutiple parameters 【发布时间】:2013-10-09 07:34:06 【问题描述】:

我在构建一个新的 MVC WebApi 项目时遇到了问题,我的发布操作似乎无法正常工作。

我有以下动作:

//--
//-- POST: /api/groups/subscribe/1/groups
[HttpPost]
public GroupResponse Subscribe(int id, List<int> groups )

    var response = new GroupResponse();
    var manager = new UserManagement();

    try
    
        response.Status = 1;

    var subscribedGroups = manager.GetSubscribedGroups(id).Select(g => g.GroupId).ToList();
    foreach (var subscribedGroup in subscribedGroups.Where(groups.Contains))
    
        groups.Remove(subscribedGroup);
    

    //-- group is a reserved word @ escapes this and treats it as a regular variable
    foreach (var @group in groups.Where(g => !manager.JoinGroup(id, g)))
    
        response.Status = 2;
        response.ErrorMessage = Constants.SUBSCRIBE_FAIL;
    
    
    catch (Exception)
    
        response.Status = 2;
        response.ErrorMessage = Constants.SUBSCRIBE_FAIL;
        return response;
    

    return response;

当我尝试使用 rest kit 中的此操作时,我收到以下错误消息:


    "Message":"No HTTP resource was found that matches the request URI 'http://localhost:50393/api/groups/subscribe'.",
    "MessageDetail":"No action was found on the controller 'Groups' that matches the request."

我尝试通过 fiddler 执行该操作,但看起来 api 忽略了我发送到 api 的数据,这让我感到困惑。

当我尝试按如下方式使用 api 时:/api/groups/subscribe?id=1 然后执行 api 操作,但是我无法传递所需的列表。

我还设置了一条路线来尝试处理这个问题,但它似乎根本没有帮助:

config.Routes.MapHttpRoute(
    "subscribe",
    "api/groups/subscribe/id/groups",
    new  controller = "Groups", action = "Subscribe", id = RouteParameter.Optional, groups = RouteParameter.Optional 
);

附加信息: 使用提琴手进行测试时,我将自己的请求编写如下:

请求标头: 用户代理:提琴手 主机:本地主机:50393 内容长度:29 内容类型:应用程序/json;字符集=utf-8

请求正文: "id":1,"groups":[1,2,3,4,5]

【问题讨论】:

“订阅”是您添加的唯一 Web API 路由吗?如果您在“订阅”路由之前注册了另一个路由,则第一个路由可能是与请求匹配的路由。 (Web API 先做路由匹配,然后是动作选择。) 不,只有订阅操作。我也有同样的想法,也重新定位了动作,结果还是一样。 【参考方案1】:

你可以试试这个,现在用 fiddler 测试。

控制器:

public class AuthenticationController : ApiController

    [AcceptVerbs("POST")]
    public void Subscribe(SubscribeClass data)
    
        //Do your stuff here
        int id = data.id;
        List<int> groups = data.groups;
        //data contains values
    

    public class SubscribeClass
    
        public int id  get; set; 
        public List<int> groups  get; set; 
    

WebApiConfig:

    public static void Register(HttpConfiguration config)
    
        config.Routes.MapHttpRoute(
            name: "AuthenticateUser",
            routeTemplate: "controller/action",
            defaults: new  ,
            constraints: new  controller = "Authentication", action = "Subscribe" 
        );
    

通过 Fiddler 发送的 JSON 对象:

 "id": 1 , "groups": [1, 2, 3, 4, 5]  

在 Fiddler 的 Headers 部分,确保为您的场景添加此标题:

Content-Type: application/json; charset=utf-8

然后是 POST URL

http://localhost/api/Authentication/Subscribe

希望这会有所帮助。

【讨论】:

我不确定为什么,但此时我可以从应用程序中得到以下消息: "Message":"No HTTP resource was found that match the request URI '在与请求匹配的控制器 'GroupApi' 上找到localhost:50393/api/groupapi/… 操作。” 我不明白的是,此控制器上的 Get 操作工作正常,但找不到任何新操作 啊,你是在添加 Content-Type,我也更新了答案以表明这一点。

以上是关于无法使用具有多个参数的 MVC Web Api HttpPost 修饰操作的主要内容,如果未能解决你的问题,请参考以下文章

(Asp.Net MVC / Web-Api)中具有相同身份验证系统的多个项目

mvc web api 关于post参数怎么接收,求教

具有多个参数的 Web API 路由

带有多个逗号分隔参数的C# Web API GET [关闭]。

如何使用 MVC Web Api GET 将对象作为参数传递

具有多个参数的 WCF Restful API