2014-11-18 4 views
0

Я добавил WebApi в существующее приложение MVC и создаю контроллер с методом post. У меня есть один маршрут, настроенный в webapiconfig. Когда я использую Fiddler для отправки на контроллер, я получаю ошибку «Несколько действий». мои ApiConfig и Controller размещены ниже. Существует несколько Ioc и DI, которые идут с Ninject. Нужно ли мне добавлять разные определения маршрутов, или это о размещенных данных?Было найдено несколько действий, соответствующих запросу - WebApi

webapiconfig.cs

public static void Register(HttpConfiguration config) 
    { 

     var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First(); 
     jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

     config.Routes.MapHttpRoute(
     name: "Materials", 
     routeTemplate: "api/materials/{id}", 
     defaults: new { controller = "materials", id = RouteParameter.Optional } 
     ); 
    } 

MaterialController.

using ????.Info.DAL; 
using ????.Info.Models; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 
using IdentitySample.Models; 

namespace ????.Info.Controllers.Api 
{ 
public class MaterialsController : BaseApiController 
{ 
    public MaterialsController(I????Repository repo) 
     :base(repo) 
    { 
    } 
    [Route("api/materials/")] 
    public IEnumerable<MaterialModel> Get() 
    { 

     IQueryable<MaterialEntities.Materials> query; 

     query = TheRepository.GetAllMaterials(); 

     var results = query 
      .ToList() 
      .Select(s => TheModelFactory.Create(s)); 

     return results; 

    } 
    [Route("api/materials/{id:int}")] 
    public HttpResponseMessage GetMaterial(int id) 
    { 

     try 
     { 
      var material = TheRepository.GetMaterial(id); 
      if (material != null) 
      { 
       return Request.CreateResponse(HttpStatusCode.OK, TheModelFactory.Create(material)); 
      } 
      else 
      { 
       return Request.CreateResponse(HttpStatusCode.NotFound); 
      } 

     } 

     catch (Exception ex) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex); 
     } 

    } 

    [HttpPost] 

    public HttpResponseMessage Post([FromBody] MaterialModel materialModel) 
    { 
     try 
     { 
      var entity = TheModelFactory.Parse(materialModel); 

      if (entity == null) Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Could not read MaterialType/Organization from body"); 

      if (TheRepository.Insert(entity) && TheRepository.SaveAll()) 
      { 
       return Request.CreateResponse(HttpStatusCode.Created, TheModelFactory.Create(entity)); 
      } 
      else 
      { 
       return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Could not save to the database."); 
      } 
     } 
     catch (Exception ex) 
     { 

      return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex); 
     } 
    } 


    public MaterialEntities.Materials Parse(MaterialModel materialmodel) 
    { 
     try 
     { 
      var material = new MaterialEntities.Materials() 
       { 
        Name = materialmodel.Name, 
        Description = materialmodel.Description, 
        DateCreated = materialmodel.DateCreated, 

       }; 


      return material; 
     } 
     catch (Exception) 
     { 

      return null; 
     } 
    } 


} 

}

+0

1.Не у вас есть какие-либо другие действия в контроллере? 2. Почему не следует использовать AttributeRouting? 3. Попробуйте добавить [HttpPost] над действием. – MichaelLo

+0

Другие действия. 2. Я еще не попал в AttributeRouting. 3. Я попробую это в первую очередь. – andy

+0

Не повезло. Я добавил HttpPost и попробовал AttributeRouting. Вот весь контроллер. – andy

ответ

0

Хорошо, спасибо за помощь в этом. Это было исправлено добавлением config.MapHttpAttributeRoutes(); в WebApiConfig. Я удалил определения маршрута по умолчанию, так как я собираюсь использовать AttributeRouting, и теперь он работает.

обновления: Похоже, что можно смешивать Attribute и маршрутизацию Конвенции в WebApiConfig, как обсуждалось here Так моя проблема была решена путем добавления config.MapHttpAttributeRoutes(); к WebApiConfig

Смежные вопросы