3

我創建了一個新的ASP.NET MVC4 Web Api項目。除了默認ValuesController之外,我還添加了另一個控制器,ScenarioController。它具有與ValuesController完全相同的方法。但由於某種原因,它的行爲有所不同。ASP.NET MVC4 Web API控制器停留在一條路線上

/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"; 
     } 
    } 
} 

回答

2

Gremlins。感謝@Pete Klien驗證代碼在我的機器外部工作。這就是我所做的。

  1. 經驗豐富的問題​​控制器只使用1方法獲取原始項目。
  2. 創建新的Web Api項目,並在問題中發佈了代碼。同樣的症狀。
  3. 清潔工程,重建所有,仍然沒有骰子。
  4. 重新啓動機器,清理,重建,再試一次,沒有骰子。
  5. 創建新的Web Api項目新解決方案,成功!
+0

+1發佈最終解決這個問題的方法 – 2013-05-10 13:57:36

+0

... aaaaaand,問題又回來了,我一直在設置新的解決方案e代碼&配置從非工作項目,並在測試第一個(新增加的)控制器時,發現只使用未參數化的Get方法相同的問題! – Noel 2013-05-10 20:30:36

+1

welp,它有助於保持您的控制器方法參數名稱和路由配置參數名稱相同,孩子。 – Noel 2013-05-10 21:07:50

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繼承。)

我不是在諷刺我建議你所有重建,然後再試一次。

+0

謝謝你試圖欺騙它。是的,我做了一次重啓,並且創建了新項目來複制我在另一個項目中看到的內容,並且在做同樣的事情時感到很驚訝。許多清潔項目和重建所有已完成:( – Noel 2013-05-10 02:23:40

+0

我沒有經驗的asp.net mvc - 是否有任何其他可以影響配置,這可能會發生?NuGet包?NET 4.0 vs 4.5? – Noel 2013-05-10 02:37:43

+0

剛剛創建了一個新的*解決方案*,使用相同的代碼,並且工作正常。 – Noel 2013-05-10 03:44:43

0

我有這個問題,並沒有得到任何工作。最後,我更改了IIS Express Project Url設置上的端口,並且全部恢復正常。它是本地主機:57846。我只是把它變成localhost:57847,一切恢復正常。