从MVC控制器中消耗IHttpActionResult

时间:2016-06-26 07:49:08

标签: asp.net-mvc asp.net-mvc-5 asp.net-web-api2

我正在使用MVC5,我有web Api控制器,它返回数据和代码如下

[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));
            }
        }

如果我在浏览器中运行此url,则以json格式正确返回数据。

现在我想通过MVC控制器在同一个项目中使用这个API控制器方法,代码如下

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

现在,当我运行此代码时,转到api方法,但当返回到控制器时,它给出了错误

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;
        }

我该如何解决这个问题?

编辑:

{{1}}

2 个答案:

答案 0 :(得分:1)

我希望您的网络API在返回结果时始终保持一致。

我认为它总是

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;
        }

答案 1 :(得分:0)

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

这里MyAPIController是你的API控制器,GetMyAPIMethod是你的API方法,MyObjectType是它返回的数据类型。在你的控制器中使用它,这应该工作