2016-06-26 3 views
0

Я работаю на MVC5, где у меня есть веб-контроллер Api, который возвращает данные и код, как показано нижеПотребляя IHttpActionResult от контроллера MVC

[Route("m/api/Group")] 
     [HttpGet] 
     public IHttpActionResult ListOfGroups() 
     { 
      try 
      { 
       var listOfGroups = GroupExecutor.GetListOfGroups(); 
       return Ok(listOfGroups); 
      } 
      catch (Exception ex) 
      { 
       LogClass.Logger.Error(ex.Message, ex); 
       return InternalServerError(); 
      } 
     } 

Если я запускаю этот адрес в Брауэр, его правильно возвращает данные в формате JSON ,

Теперь я хочу потреблять этот метод контроллера API в рамках того же проекта с помощью контроллера MVC и код, как показано ниже

[HttpPost] 
     [ValidateAntiForgeryHeader] 
     public ActionResult GetListOfGroups() 
     { 
      try 
      { 
       var listofGroups = new GroupController().ListOfGroups(); 
       return GetJsonContentResult(listofGroups); 
      } 
      catch (Exception ex) 
      { 
       LogClass.Logger.Error(ex.Message, ex); 
       return new HttpStatusCodeResult(HttpStatusCode.InternalServerError, Utility.GetDescriptionFromEnumValue(Helper.TypeOfError.ErrorOccuredWhileProcessingRequest)); 
      } 
     } 

Теперь Когда я запускаю этот код идет в методе апи, но когда вернулся обратно в контроллер, его дает ошибку

Error getting value from 'Content Negotiation' on 'System.Web.Http.Results.OkNegotiatedContentResult 

Как я могу решить эту проблему?

EDIT:

public ContentResult GetJsonContentResult(object data) 
     { 
      var camelCaseFormatter = new JsonSerializerSettings(); 
      camelCaseFormatter.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
      var jsonResult = new ContentResult 
      { 
       Content = JsonConvert.SerializeObject(data, camelCaseFormatter), 
       ContentType = "application/json" 
      }; 
      return jsonResult; 
     } 
+0

Я не понимаю, почему вам нужно вызвать метод web api, как это в вашем контроллере? – dotnetstep

+0

Потому что его функция в MVC5 вызывать напрямую API-контроллер .. нет необходимости создавать клиента – Mahajan344

+0

, что делает ваш метод GetJsonContentResult? – dotnetstep

ответ

0
var controller = new MyAPIController(); 
var content = controller.GetMyAPIMethod(someParam); 
      var myModel = ((OkNegotiatedContentResult<MyObjectType>)(content.Result)).Content; 

Здесь MyAPIController ур API контроллер, GetMyAPIMethod ур метод API и MyObjectType это тип данных, он возвращается. Используйте это в своем контроллере, и это должно работать.

1

Я надеюсь, что ваша веб-ави всегда будет соответствовать возврату результата.

Я полагаю, что все дни

Ok(yourdata) 

Теперь ваш метод GetJsonContentResult следует модифицировать следующим образом. В этом случае ваш WebAPI возвращает OkNegotiatedContentResult и из этого вы должны прочитать свойство Content. Это я сделал с размышлением. (Есть и другие способы сделать это).

public ContentResult GetJsonContentResult(object data) 
     {    
      var camelCaseFormatter = new JsonSerializerSettings(); 
      camelCaseFormatter.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
      PropertyInfo pinfo = data.GetType().GetProperty("Content");    
      var jsonResult = new ContentResult 
      { 

       Content = JsonConvert.SerializeObject(pinfo.GetValue(data) , camelCaseFormatter), 
       ContentType = "application/json" 
      }; 
      return jsonResult; 
     } 
Смежные вопросы