【问题标题】:No type was found that matches the controller named in asp.net website project找不到与 asp.net 网站项目中命名的控制器匹配的类型
【发布时间】:2016-04-19 06:00:28
【问题描述】:

我在运行我的 asp.net 网站项目时遇到以下错误。

错误: 找不到与名为“XXXX”的控制器匹配的类型。

路线配置:

 void Application_Start(object sender, EventArgs e)
{
    // Code that runs on application startup
   // AuthConfig.RegisterOpenAuth();
    RouteConfig.RegisterRoutes(RouteTable.Routes);

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

WebApi 控制器:

  public class SampleWebController : ApiController
{
    public object SampleAction(Dictionary<string, string> jsonResult)
    {

    }
 }

网址: ServiceUrl="../api/SampleWeb"

请任何人提供解决此错误的想法。

如果我在这里做错了,也请告诉我。

提前致谢。

【问题讨论】:

  • 您是如何提出请求的?你在尝试什么网址?
  • 我在我的示例中使用了这个服务 url。 "ServiceUrl="../api/SampleWeb"" @Jasen
  • 编辑您的问题并为 url 请求添加代码。

标签: c# asp.net asp.net-web-api asp.net-web-api-routing


【解决方案1】:

如果您在同一个控制器中有多个 POST 操作,您应该像这样进行路由配置:

System.Web.Http.GlobalConfiguration.Configuration.Routes.MapHttpRoute(
           name: "DefaultApi",
           routeTemplate: "{controller}/{action}/{id}",
           defaults: new { id = System.Web.Http.RouteParameter.Optional });

然后在你的控制器中你可以有多个 GET 和 POST 方法

  public class TestController : ApiController
  {
         [ActionName("PostMe")]
         public object PostMe()
         {
         }

         [ActionName("PostMeTwo")]
         public object PostMeTwo()
         {

         }

        [HttpGet]
        public object TestGet()
        {

        }
  }

然后您可以使用AjaxPostMan 为操作生成一个POST 请求,如下所示:

localhost:XXXX/Test/PostMe

Test 是控制器名称,PostMe 操作名称 - 两者都是必需的

localhost:XXXX/Test/PostMeTwo[POST]
localhost:XXXX/Test/TestGet [GET]

【讨论】:

    【解决方案2】:

    你有两个选择。

    第一个选项,为你的控制器添加一个动作名称

    public class SampleWebController : ApiController
    {
        [ActionName("SampleAction")]
        public object SampleAction(Dictionary<string, string> jsonResult)
        {
    
        }
     }
    

    您可以将其称为“../api/SampleWeb/SampleAction”

    这样你就不需要改变你的路由配置

    第二个选项,将您的路线配置更改为

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

    和你的方法

    public class SampleWebController : ApiController
    {
        [HttpGet]
        public object GetSampleAction(Dictionary<string, string> jsonResult)
        {
    
        }
     }
    

    如果您正在发出获取请求,则可以调用“../api/SampleWeb”。

    注意:如果您要在同一个控制器中拥有多个获取、发布、放置等,请使用第一个选项。如果您只计划为每个控制器执行一次 get、post、put 等操作,那么选项 2 会更简洁。

    编辑:要测试选项 1,请将您的方法更改为

    public class SampleWebController : ApiController
    {
        [ActionName("SampleAction")]
        public object SampleAction(int id)
        {
            return id;
        }
     }
    

    并称您为 api,例如“.../api/SampleWeb/SampleAction/10”。如果这可行,则意味着您传递给 SampleAction 的数据无法转换为 Dictionary ,这就是您的问题,而不是 webapi 或您的路由。确保您的路线配置仍然

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

    【讨论】:

    • 感谢@garethb。我在控制器中有多个帖子。我尝试了你的两种方法,但它对我不起作用。有没有其他方法可以做到这一点?
    • 如果你实现了第一个选项,那么它可能找不到你的api方法,因为方法签名不正确。请参阅编辑以尝试尝试。
    猜你喜欢
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    相关资源
    最近更新 更多