我正在从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(NOT Authenticate)和错误:
参数字典包含非可空类型'System.Int32'的参数'id'的空条目,用于'Navtrak.Services.WCF.NavtrakAPI.Controllers.UsersController'中的方法'System.String Get(Int32)' . 可选参数必须是引用类型,可空类型,或者声明为可选参数 .
如何调用自定义方法名称,例如Authenticate?
6 回答
有关命名操作的详细讨论,请参阅此文章 . 它还显示您可以使用[HttpGet]属性,而不是使用“get”为操作名称添加前缀 .
http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
如果您使用 ASP.NET 5 与 ASP.NET MVC 6 ,大多数答案只是赢了't work because you' ll通常让MVC为您创建适当的路由集合(使用默认的RESTful约定),这意味着您将找不到任何
Routes.MapRoute()
调用随意编辑 .Startup.cs
文件调用的ConfigureServices()
方法将使用内置于ASP.NET 5中的依赖注入框架注册MVC:这样,当您在该类中稍后调用ApplicationBuilder.UseMvc()
时,MVC框架将自动将这些默认路由添加到您的应用程序 . 我们可以通过查看框架源代码中的UseMvc()
方法实现来了解引擎背后发生的事情:关于这一点的好处是框架现在可以处理所有的艰苦工作,遍历所有Controller的操作并设置其默认路由,从而为您节省一些冗余工作 .
不好的是,关于如何添加自己的路线的文档很少或根本没有 . 幸运的是,您可以通过使用 Convention-Based 和/或 Attribute-Based 方法(也称为属性路由)轻松完成此操作 .
Convention-Based
在您的Startup.cs类中,替换为:
有了这个:
Attribute-Based
关于MVC6的一个好处是,您还可以通过使用适当的
RouteAttribute
和/或HttpGet
/HttpPost
模板参数来装饰Controller
类和/或Action
方法,从而在每个控制器的基础上定义路由,例如:该控制器将处理以下请求:
另请注意,如果使用两种方法,基于属性的路由(定义时)将覆盖基于约定的路径,并且它们都将覆盖
UseMvc()
定义的默认路由 .有关详细信息,您也可以在我的博客上使用read the following post .
默认情况下,路由配置遵循RESTFul约定,这意味着它只接受Get,Post,Put和Delete操作名称(在global.asax =>中查看路由,默认情况下它不允许您指定任何操作名称=>它使用HTTP动词来分派) . 因此,当您向
/api/users/authenticate
发送GET请求时,您基本上调用Get(int id)
操作并传递id=authenticate
,这显然会崩溃,因为您的Get操作需要一个整数 .如果您想拥有与标准动作名称不同的动作名称,可以在
global.asax
中修改路线定义:现在,您可以导航到
/api/values/getauthenticate
以对用户进行身份验证 .这是迄今为止我提出的最佳方法,即在支持常规REST方法的同时引入额外的GET方法 . 将以下路由添加到WebApiConfig:
我用下面的测试类验证了这个解决方案 . 我能够成功点击下面控制器中的每个方法:
我确认它支持以下请求:
注意如果您的额外GET操作不以'Get'开头,您可能需要向该方法添加HttpGet属性 .
我是进入MVC4世界的日子 .
为了它的 Value ,我有一个SitesAPIController,我需要一个自定义方法,可以调用如下:
使用不同的值为最后一个参数获取具有不同配置的记录 .
最后为我工作的是:
SitesAPIController中的方法:
这在WebApiConfig.cs中
只要我将命名为我遇到了:
当我将它重命名为时,它开始工作了 . 显然,参数名称与占位符中的值匹配 .
随意编辑此答案,使其更准确/解释 .
默认情况下,Web Api需要api / / 形式的URL来覆盖此默认路由 . 您可以使用以下两种方式之一设置路由 .
First option:
在WebApiConfig.cs中添加以下路由注册
使用HttpGet和参数装饰你的动作方法,如下所示
对于调用上面的方法url将如下所示
http://localhost:[yourport]/api/MyData/ReadMyData?param1=value1¶m2=value2¶m3=value3
Second option 将路由前缀添加到Controller类并使用HttpGet装饰您的操作方法,如下所示 . 在这种情况下,无需更改任何WebApiConfig.cs . 它可以有默认路由 .
对于调用上面的方法url将如下所示
http://localhost:[yourport]/api/MyData/ReadMyData?param1=value1¶m2=value2¶m3=value3