一尘不染

ASP.NET Web API中的自定义方法名称

c#

我正在从WCF Web API转换为新的ASP.NET MVC 4 Web
API。我有一个UsersController,我想有一个名为Authenticate的方法。我看到了有关如何执行GetAll,GetOne,Post和Delete的示例,但是如果我想在这些服务中添加其他方法怎么办?例如,我的UsersService应该有一个称为Authenticate的方法,他们在其中传递用户名和密码,但这是行不通的。

public class UsersController : BaseApiController
{
    public string GetAll()
    {
        return "getall!";
    }

    public string Get(int id)
    {
        return "get 1! " + id;
    }

    public User GetAuthenticate(string userName, string password, string applicationName)
    {
        LogWriter.Write(String.Format("Received authenticate request for username {0} and password {1} and application {2}",
            userName, password, applicationName));

        //check if valid leapfrog login.
        var decodedUsername = userName.Replace("%40", "@");
        var encodedPassword = password.Length > 0 ? Utility.HashString(password) : String.Empty;
        var leapFrogUsers = LeapFrogUserData.FindAll(decodedUsername, encodedPassword);

        if (leapFrogUsers.Count > 0)
        {
            return new User
            {
                Id = (uint)leapFrogUsers[0].Id,
                Guid = leapFrogUsers[0].Guid
            };
        }
        else
            throw new HttpResponseException("Invalid login credentials");
    }
}

我可以浏览到myapi / api / users /,它将调用GetAll,我可以浏览到myapi / api / users /
1,并且它将调用Get,但是,如果我调用myapi / api / users / authenticate?username = {0}
&password = {1},然后它将调用Get(不进行身份验证)并报错:

参数字典包含用于’Navtrak.Services.WCF.NavtrakAPI.Controllers.UsersController’中方法’System.String
Get(Int32)’的非空类型’System.Int32’的参数’id’的空条目。可选参数必须是引用类型,可为空的类型,或者必须声明为可选参数。

如何调用自定义方法名称,例如Authenticate?


阅读 530

收藏
2020-05-19

共1个答案

一尘不染

默认情况下,路由配置遵循RESTFul约定,这意味着它将仅接受Get,Post,Put和Delete操作名称(默认情况下,请查看global.asax
=>中的路由,不允许您指定任何操作名称=>它使用HTTP动词进行分派)。因此,当您向GET请求发送消息时,/api/users/authenticate您基本上是在调用该Get(int id)操作并传递id=authenticate,这显然会崩溃,因为您的Get操作需要一个整数。

如果您希望使用与标准名称不同的动作名称,则可以在global.asax以下位置修改路径定义:

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

现在,您可以导航到/api/values/getauthenticate以验证用户身份。

2020-05-19