2016-11-10 1 views
1

Я не уверен, как назвать эту проблему. По этой причине я также затруднялся найти эту проблему. Самый близкий совпадающий вопрос, который я нашел, был Web Api Routing conflict for two different controllers?.Конфликт маршрутизации веб-API при добавлении метода PUT для подпрограммы с несколькими контроллерами

Как спрашивающего в этом вопросе, у меня есть два различных контроллеров, которые частично совпадают:

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() 
    { 
     //... 
    } 
} 

И мой маршрутизации конфиги:

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} не указан в типе, он потенциально может быть строкой, которая говорит «Материалы», создавая конфликт. Чтобы решить эту проблему, я могу просто указать тип параметра ({jobId:long}):

[HttpPut, Route("v1/Jobs/{jobId:long}"), ResponseType(typeof(void))] 
    public async Task<HttpResponseMessage> Put(long jobId, DTJob job) 
    { 
     //... 
    } 
Смежные вопросы