Web API控制器中的多个GET和POST方法

时间:2014-03-27 10:03:25

标签: c# asp.net-web-api extjs4 asp.net-web-api-routing

我几天来一直在努力解决这个问题。我有一个需要多个GET和POST方法的控制器。不知怎的,我设法在控制器中实现了多个GET方法。那时只有一种POST方法。一切都运行良好,直到我再引入一个POST方法。每当我使用ExtJS从客户端使用POST方法时,只会调用第一个POST方法。以下是我的控制器中的方法:

[AllowAnonymous]
[ActionName("userlist")]
[HttpGet]
public List<MyApp.Entity.Models.usermaster> Get(bool isActive)
{
//My code
}

[AllowAnonymous]
[ActionName("alluserlist")]
[HttpGet]
public List<MyApp.Entity.Models.usermaster> Get()
{
//My code
}

[AllowAnonymous]
[ActionName("updateuser")]
[HttpPost]
public string UpdateUser(JObject userData)
{
//My code
}


[AllowAnonymous]
[ActionName("adduser")]
[HttpPost]
public string AddUser(JObject newUserData)
{
//My code
}

我还有两个路由配置文件。第一个配置如下:

public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}

另一个文件具有以下配置:

public static void Register(HttpConfiguration config)
{
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
name: "ControllersWithAction",
routeTemplate: "api/{controller}/{action}");

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

这是对api进行ajax调用的方式:

Ext.Ajax.request({
     url: 'localhost/myapp/api/users/adduser',
     mode: 'POST',
     params: {
              userName: 'user',
              password: 'password'
             },
     success: function (resp) {
              var respObj = Ext.decode(resp.responseText);
                  if (respObj == 'added') {
                  Ext.Msg.alert('Success', 'User added.');
                  }
                                        else {
                                            Ext.Msg.alert('Error', respObj);
                                        }
                                    },
                                    failure: function (resp) {
                                        Ext.Msg.alert('Error', 'There was an error.');
                                    }
                                });

有谁可以指出错误?或者,在带有路由配置的第一侧控制器中使用多个GET和POST方法的任何示例都将非常有用。

3 个答案:

答案 0 :(得分:4)

为什么不对UpdateUser使用 PUT 方法?

[AllowAnonymous]
[HttpPut]
public string UpdateUser(JObject userData)
{
   //My code
}

更新

你可以使用多个 POST ,但是你应该使用 ActionNames ,但不是 restful 或停止使用复杂类型作为参数。因为 Web API 会在尝试选择最合适的操作时忽略复杂类型。检查这些:

Multiple actions for the same HttpVerb

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

答案 1 :(得分:0)

你可以试试这个

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "ApiById",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: new { id = @"^[0-9]+$" }
        );

        config.Routes.MapHttpRoute(
            name: "ApiByName",
            routeTemplate: "api/{controller}/{action}/{name}",
            defaults: null,
            constraints: new { name = @"^[a-z]+$" }
        );

        config.Routes.MapHttpRoute(
            name: "ApiByAction",
            routeTemplate: "api/{controller}/{action}",
            defaults: new { action = "Get" }
        );
    }
}

答案 2 :(得分:-3)

您也可以将ActionName用于您的方法

[AllowAnonymous]
[HttpPost]
[ActionName("userlist")]
public string UpdateUser(JObject userData)
{
//My code
}


[AllowAnonymous]
[HttpPost]
[ActionName("alluserlist")]
public string AddUser(JObject newUserData)
{
//My code
}

此外,当您调用post方法时,必须在API的URL中使用ActionName。 确保您的路线Config在WebApiConfig中有{action}。

对于Web API中的自定义绑定,您可以参考以下链接 https://blogs.msdn.microsoft.com/jmstall/2012/04/16/how-webapi-does-parameter-binding/