为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
HUH函数 2019-12-12 14:03:25
我正在从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?
查看完整描述

3 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

我已经进入MVC4世界了。


对于它的价值,我有一个SitesAPIController,并且我需要一个自定义方法,该方法可以这样称呼:


http://localhost:9000/api/SitesAPI/Disposition/0

最后一个参数使用不同的值来获取具有不同处置方式的记录。


最终为我工作的是:


SitesAPIController中的方法:


// GET api/SitesAPI/Disposition/1

[ActionName("Disposition")]

[HttpGet]

public Site Disposition(int disposition)

{

    Site site = db.Sites.Where(s => s.Disposition == disposition).First();

    return site;

}

而这在WebApiConfig.cs中


// this was already there

config.Routes.MapHttpRoute(

    name: "DefaultApi",

    routeTemplate: "api/{controller}/{id}",

    defaults: new { id = RouteParameter.Optional }

);


// this i added

config.Routes.MapHttpRoute(

    name: "Action",

    routeTemplate: "api/{controller}/{action}/{disposition}"

 );

只要我将{disposition}命名为{id},我就一直遇到:


{

"Message": "No HTTP resource was found that matches the request URI 'http://localhost:9000/api/SitesAPI/Disposition/0'.",

"MessageDetail": "No action was found on the controller 'SitesAPI' that matches the request."

}

当我将其重命名为{disposition}时,它开始工作。因此,显然参数名与占位符中的值匹配。


查看完整回答
反对 回复 2019-12-12
  • 3 回答
  • 0 关注
  • 1136 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信