在mvc4中创建用于添加和删除的通用路由

时间:2012-07-19 20:19:28

标签: asp.net-mvc rest routes asp.net-mvc-4

由于您无法在大多数托管网站上使用Put和Delete,因此我尝试创建一条避免使用这些网站的路由,但我无法让它工作..

我想要一条这样的路线

api/someController/Add/someInt

使用此RESTsharp代码

private RestClient client;

public RESTful()
    {
        client = new RestClient
        {
            CookieContainer = new CookieContainer(),
            BaseUrl = "http://localhost:6564/api/",
            //BaseUrl = "http://localhost:21688/api/",
            //BaseUrl = "http://madsskipper.dk/api/"
        };
    }

    public void AddFriend(int userId)
    {
        client.Authenticator = GetAuth();

        RestRequest request = new RestRequest(Method.POST)
        {
            RequestFormat = DataFormat.Json,
            Resource = "Friends/Add/{userId}"
        };

        request.AddParameter("userId", userId);

        client.PostAsync(request, (response, ds) =>
        {
        });
    }

在我的FriendsController中点击此方法

// POST /api/friends/add/Id
[HttpPost] //Is this necesary?
public void Add(int id)
{         
}

所以我在路线配置中添加了这个

    routes.MapHttpRoute(
    name: "ApiAdd",
    routeTemplate: "api/{controller}/Add/{id}",
    defaults: new { id = RouteParameter.Optional }
);

但是当我这样做时,我只打了我的FriensController的构造函数而不是Add方法

编辑:

还尝试制作此路线配置

    routes.MapHttpRoute(
        name: "ApiAdd",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { action = "Add", id = RouteParameter.Optional }
    );

但是同样的结果,控制器被击中而不是动作


解决方案: 发现参数是用RESTsharp错误添加的,所以不是

    RestRequest request = new RestRequest(Method.POST)
    {
        RequestFormat = DataFormat.Json,
        Resource = "Friends/Add/{userId}"
    };

    request.AddParameter("userId", userId);

应该是

        RestRequest request = new RestRequest(Method.POST)
        {
            RequestFormat = DataFormat.Json,
            Resource = "Friends/Add/{userId}"
        };

        request.AddUrlSegment("userId", userId.ToString());

1 个答案:

答案 0 :(得分:2)

您可以在Api路线定义中包含操作名称:

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

然后采取此行动:

[HttpPost]
public void Add(int id)
{

}

现在您可以触发对/api/friends/add/123网址的POST请求。

[HttpPost]属性确保只能使用POST谓词调用此操作。如果你删除它,你仍然可以通过GET调用它,但这是你不应该对可能修改服务器状态的动作做的事情。