2014-03-27 107 views
2

我一直在努力解决这些问题几天。我有一个需要有多个GET和POST方法的控制器。不知何故,我设法在控制器中实现多个GET方法。那时只有一个POST方法。一切都运行良好,直到我引入了一个更多的POST方法。每当我使用ExtJS从客户端使用POST方法时,只有第一个POST方法被调用。以下是我的控制器的方法:Web API控制器中的多个GET和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 }); 
} 

这是Ajax调用是如何在API的:

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方法的任何示例都将非常有用。

+1

你怎么叫他们? –

+0

对于获取方法,我使用'localhost/myapp/api/users/userlist/true'&localhost/myapp/api/users/alluserlist'。对于这两种POST方法,我只使用具有不同参数的'localhost/myapp/api/users'。 – user1640256

+0

但你打电话给他们?你如何在请求中指定它是POST还是GET? –

回答

4

为什么不使用PUT方法UpdateUser

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

更新

您可以使用多个POST但那么应该使用ActionNames的作品,但不是宁静或停止使用复杂类型作为参数。因为Web API忽略复杂类型当它试图选择最合适的动作。检查这些:

Multiple actions for the same HttpVerb

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

+0

我会试一试。另一方面,我有一个问题,为什么我不能在控制器中使用多个POST方法?如果可以的话,怎么样? – user1640256

+0

我已经包含actionname属性。仍然没有运气。 – user1640256

+0

我更新了我的回答 –

-3

您可以使用ActionName为你的方法以及

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


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

而且,你必须使用ActionName在您的网址为API,当你打电话给你post方法。 确保您的路由配置在WebApiConfig中有{action}。

定制的Web API,你可以参考以下结合链接 https://blogs.msdn.microsoft.com/jmstall/2012/04/16/how-webapi-does-parameter-binding/

+0

您没有看到问题。我为每个方法使用actionname属性。 – user1640256

+0

这不起作用 – ilans

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" } 
     ); 
    } 
} 
相关问题