2016-11-10 92 views
1

この問題の名前を付ける方法がわかりません。私はこのような理由でこの特定の問題を探し出すことも困難でした。私が見つけた最も近い一致する質問はWeb Api Routing conflict for two different controllers?でした。複数のコントローラーを使用してサブルートにPUTメソッドを追加するとWeb APIが競合します

public class JobsController : ApiController 
{ 
    [ResponseType(typeof(DTJob[]))] 
    public async Task<HttpResponseMessage> Get() 
    { 
     //... 
    } 

    [Route("v1/Jobs/Group"), ResponseType(typeof(DTJob[]))] 
    public async Task<HttpResponseMessage> GetFromGroup() 
    { 
     //... 
    } 

    [HttpGet, Route("v1/Jobs/{jobId}/Status"), ResponseType(typeof(string))] 
    public async Task<HttpResponseMessage> GetStatus(long jobId) 
    { 
     //... 
    } 

    [HttpPut, Route("v1/Jobs/{jobId}/Status"), ResponseType(typeof(void))] 
    public async Task<HttpResponseMessage> UpdateStatus(long jobId, string status) 
    { 
     //... 
    } 

    //This method messes up all other controllers 
    [HttpPut, Route("v1/Jobs/{jobId}"), ResponseType(typeof(void))] 
    public async Task<HttpResponseMessage> Put(long jobId, DTJob job) 
    { 
     //... 
    } 

    //But it works if I replace the above method with the default routing pattern: 
    //[ResponseType(typeof(void))] 
    //public async Task<HttpResponseMessage> Put(long id, DTJob job) 
    //{ 
    // //... 
    //} 
} 

および類似の接頭辞がある別のコントローラ:

[RoutePrefix("v1/Jobs/Materials")] 
public class MaterialsController : ApiController 
{ 
    [Route, ResponseType(typeof(DTMaterial[]))] 
    public async Task<HttpResponseMessage> Get() 
    { 
     //... 
    } 
} 

そして、私のルーティングのconfigsを:その質問でアスカー同様

、私はまた、部分的に一致する2つの異なるコントローラを持っている

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.MapMvcAttributeRoutes(); 
    } 
} 

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     //... 
     // Web API routes 
     config.MapHttpAttributeRoutes(); 
     //... 
     config.Routes.MapHttpRoute(
      name: "Newest", 
      routeTemplate: "v1/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

ここでは何が起こっていますか?

答えて

0

私は再びこの問題を発見したと思います。 {jobId}は型に指定されていないため、 "Materials"という文字列が原因で競合が発生する可能性があります。これを解決するには、パラメータ({jobId:long})にタイプを指定するだけです:

[HttpPut, Route("v1/Jobs/{jobId:long}"), ResponseType(typeof(void))] 
    public async Task<HttpResponseMessage> Put(long jobId, DTJob job) 
    { 
     //... 
    } 
関連する問題