ASP.NET MVC4 Web API控制器被困在一条路线上

时间:2013-05-09 23:01:07

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

我创建了一个新的ASP.NET MVC4 Web Api项目。除了默认ValuesController之外,我添加了另一个控制器ScenarioController。它具有与ValuesController完全相同的方法。但由于某种原因,它的行为有所不同。

/api/values/ => "value1","value2"
/api/values/1 => "value"
/api/scenario/ => "value1","value2"
/api/scenario/1 => "value1","value2"
                   ^^^^^^^^^^^^^^^^^
                   should return "value"!

使用断点,我知道/api/scenario/1实际上已发送到public IEnumerable<string> Get(),而不是预期的public string Get(int id)。为什么呢?

供参考,以下是相关文件(这些是原始默认的mvc4-webapi类,未修改任何内容):

的Global.asax.cs

namespace RoutingTest
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}

WebApiConfig.cs

namespace RoutingTest
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            // Uncomment the following line of code to enable query support for actions with an IQueryable or IQueryable<T> return type.
            // To avoid processing unexpected or malicious queries, use the validation settings on QueryableAttribute to validate incoming queries.
            // For more information, visit http://go.microsoft.com/fwlink/?LinkId=279712.
            //config.EnableQuerySupport();

            // To disable tracing in your application, please comment out or remove the following line of code
            // For more information, refer to: http://www.asp.net/web-api
            config.EnableSystemDiagnosticsTracing();
        }
    }
}

ValuesController.cs

namespace RoutingTest.Controllers
{
    public class ValuesController : ApiController
    {
        // GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
        // GET api/values/5
        public string Get(int id)
        {
            return "value";
        }
    }
}

ScenarioController.cs (是的,它位于Controllers文件夹中)

namespace RoutingTest.Controllers
{
    public class ScenarioController : ApiController
    {
        // GET api/scenario
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/scenario/5
        public string Get(int id)
        {
            return "value";
        }
    }
}

3 个答案:

答案 0 :(得分:2)

我刚刚尝试了你的代码并得到了预期的结果:

> curl http://localhost:53803/api/values
["value1","value2"]
> curl http://localhost:53803/api/values/1
"value"
> curl http://localhost:53803/api/scenario
["value1","value2"]
> curl http://localhost:53803/api/scenario/1
"value"
>

(顺便说一下,不要求它位于Controllers文件夹中。HttpConfiguration.Routes.MapHttpRoute只需查找从ApiController继承的所有类。)

当我建议你重建所有并再试一次时,我并没有讽刺。

答案 1 :(得分:2)

<强>小魔怪即可。感谢@Pete Klien验证代码在我的机器外部是否正常工作。这就是我所做的。

  1. Controller的经验问题仅使用1个方法获取原始项目。
  2. 创建了新的Web Api项目,其中包含我在问题中发布的代码。相同的症状。
  3. 清洁项目,全部重建,仍然没有骰子。
  4. 重新启动机器,清洁,重建,再试一次,没有骰子。
  5. 在新解决方案中创建新的Web Api项目成功!

答案 2 :(得分:0)

我遇到了这个问题,无法正常工作。最后,我更改了IIS Express Project Url设置上的端口,一切都恢复正常。这是localhost:57846。我刚做了localhost:57847,一切都恢复了正常。