2015-07-01 106 views
0

我應該向您展示我的RouteConfig.cs開始:的Web API - 映射請求URL和身體參數方法的參數

public static void Register(HttpConfiguration configuration) 
{ 
    configuration.Routes.MapHttpRoute("noKey", 
             "{controller}"); 

    configuration.Routes.MapHttpRoute("oneKey", 
             "{controller}/{id}"); 

    configuration.Routes.MapHttpRoute("twoKeys", 
             "{controller}/{firstKey}/{secondKey}"); 

    // SomeProperty -> someProperty 
    var jsonFormatter = configuration.Formatters.OfType<JsonMediaTypeFormatter>().First(); 
    jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
} 

我有以下的基類:

public abstract class RestController<Key, PostDTO, PutDTO, QueryData> 
{ 
     // ... 

     protected abstract Task<IHttpActionResult> Put(Key id, PutDTO dto); 

     // ... 

     [HttpPut] 
     [ValidateArgument("dto")] 
     public async Task<IHttpActionResult> BasePut([FromUri] Key id, [FromBody] PutDTO dto) 
     { 
      return await Put(id, dto); 
     } 
} 

ValidateArgumentAttribute是一個自定義屬性,我做了驗證輸入DTO。

我試圖調用此方法是這樣的:

HTTP PUT - /users/mcicero 

正如你所看到的,我有一個UsersController(/用戶),我希望做一個PUT請求與關鍵mcicero實體(/用戶/ mcicero)。

DTO沿請求有效載荷發送,由[FromBody]參數屬性表示。

但是,我收到了一個404 Not Found響應,就好像端點無法解析爲有效路由一樣。

這裏有什麼問題?

+0

什麼是 「關鍵」 的實際類型? – hazjack

+0

@hazjack在這個例子中(UsersController),它的類型是'string' –

+0

你仔細檢查過url/port嗎?我認爲它應該有效。我的類似案例工作正常:) – hazjack

回答

1

與此幾個小時戰鬥之後......我終於設法找到了解決問題的方法(糾正我,如果這是不好的)

我不得不啓用所有動詞(verb="*")到ExtensionlessUrlHandler-Integrated-4.0處理器:

的Web.config

<system.webServer> 
    <handlers> 
     <remove name="OPTIONSVerbHandler" /> 
     <remove name="TRACEVerbHandler" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    </system.webServer> 
+0

Congrats Mati :) – hazjack

相關問題