请原谅我在这方面的无知。我已经阅读了很多线程,仍然无法正确使用我的路由。
我有这样的ProductsController:
public class ProductsController : ApiController
{
[ActionName("GetListOfStudents")]
public static List<Structures.StudentInfo> GetListOfStudents(string Username, string Password)
{
List<Structures.StudentInfo> si = StudentFunctions.GetListOfStudents(Username, Password);
return si;
}
}
我有一个控制台测试程序,我在其中定义了路径:
config.Routes.MapHttpRoute(
name: "ApiByAction",
routeTemplate: "api/products/GetListOfStudents",
defaults: new { controller = "products", action = "GetListOfStudents" });
但是当我打电话时
GET http://localhost:8080/api/Products/GetListOfStudents
我收到错误消息:
MessageDetail=No action was found on the controller 'Products' that matches the name 'GetListOfStudents'.
我一直在拔头发,无法确定正确的路线应该是什么。
任何善良的人都会照顾我吗?
答案 0 :(得分:12)
好的 - 感谢帮助偷看!
这就是我为了让它发挥作用所做的:
config.Routes.MapHttpRoute(
name: "ApiByAction",
routeTemplate: "api/products/GetListOfStudents/{username}/{password}",
defaults: new { controller = "products", action = "GetListOfStudents" }
);
感谢大家的帮助!
答案 1 :(得分:11)
注册全局api接入点时,应按以下方式告知配置使用哪条路由:
config.Routes.MapHttpRoute(
name: "ApiByAction",
routeTemplate: "api/{controller}/{action}
defaults: new { controller = "products", action = "GetListOfStudents" });
在此示例中,您明确告诉控制器它应该只转到&#34;产品&#34;在没有指定控件或操作的情况下,你可以使它成为通用的,只需省略默认值,如下所示:
config.Routes.MapHttpRoute(
name: "ApiByAction",
routeTemplate: "api/{controller}/{action}
那应该做的工作:)
答案 2 :(得分:6)
您的GetListOfStudents
操作需要两个参数,用户名和密码。但是,路由定义既不包含路由模板中的规范,这些规范应该来自这些参数的值,也不包含defaults:
参数定义中那些参数缺省值的规范。
因此,当请求进入时,路由能够找到您的控制器,但它无法找到它可以使用请求和路由上下文调用的操作,因为它没有用户名和密码参数的信息。
答案 3 :(得分:3)
最重要的是: ASP.Net的mvc不仅通过名称寻求行动,还会检查方法的签名,只有方法是非静态,名称匹配和参数匹配,动作将被执行。
对于您的情况,有两种方法可以纠正它。 一种方法是声明默认值,mvc将在找不到参数时使用默认值。
public List<Structures.StudentInfo> GetListOfStudents(string Username = null, string Password = null)
{
List<Structures.StudentInfo> si = StudentFunctions.GetListOfStudents(Username, Password);
return si;
}
第二种方式是使用覆盖
public List<Structures.StudentInfo> GetListOfStudents()
{
return GetListOfStudents(null, null);
}
public List<Structures.StudentInfo> GetListOfStudents(string Username, string Password)
{
List<Structures.StudentInfo> si = StudentFunctions.GetListOfStudents(Username, Password);
return si;
}
答案 4 :(得分:0)
我遇到了这个问题并通过将动词作为动作的一部分(即GetThis,GetThat)并手动创建路径来解决它。我试图使用属性创建路由,但这不起作用。这个SO question可能是关于为什么属性不起作用的答案,我还没有得到理解。作为其他任何具有相同问题的人的补充说明,当在本地调试时,当发现“找不到动作”xml时,IE崩溃了。一旦我放弃并切换到Chrome,就会返回消息详细信息,很明显我的控制器至少被找到了,这只是让行动起作用的问题......
答案 5 :(得分:0)
如果要调用不带参数的GetListOfStudents方法,则必须为参数设置默认值。如 GetListOfStudents(string Username = null,string Password = null) 否则,您必须使用Parameters调用方法。 获取http://localhost:8080/api/Products/GetListOfStudents/Username/Password
答案 6 :(得分:0)
一个问题可能是WebApiConfig.cs文件中路由声明的顺序。看看here关于路由的优先级。如果您有两条具有相同参数数量的路线,则可能需要重新排列路线,或者-根据路线的具体程度-硬编码控制器或操作名称
答案 7 :(得分:-2)
发送时,使用base64对密码进行编码。 然后,当你要使用它解码它。
byte[] numArray = Convert.FromBase64String(password);
string Pass = Encoding.UTF8.GetString(numArray);
List<Structures.StudentInfo> si = StudentFunctions.GetListOfStudents(Username, Pass);
对我来说很好。