在与该请求匹配的控制器上未找到任何操作

时间:2014-04-07 14:11:52

标签: c# asp.net .net routing

请原谅我在这方面的无知。我已经阅读了很多线程,仍然无法正确使用我的路由。

我有这样的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'.

我一直在拔头发,无法确定正确的路线应该是什么。

任何善良的人都会照顾我吗?

8 个答案:

答案 0 :(得分:12)

好的 - 感谢帮助偷看!

这就是我为了让它发挥作用所做的:

  1. 删除了&#34;静态&#34;来自GetListOfStudents函数。
  2. 添加了以下路线。
  3. 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);

对我来说很好。