Web Api IHttpActionResult HttpContent

时间:2014-03-17 20:37:04

标签: c# asp.net-web-api

我希望我的所有控制器调用都返回一个IHttpActionResult,所以我创建了一个实现此接口的类。当有人进行GET调用时,显然会将一些复杂数据发送回此IHttpActionResult响应对象内的客户端。现在我无法将我的内容插入到HttpResponseMessage中。这是我调用我的一个GET方法时的错误。

  

{"消息":"发生错误。"," ExceptionMessage":"无法转换类型' XXXXX.DomainModels .News.AllNewsItems' to' System.Net.Http.HttpContent'"," ExceptionType":" Microsoft.CSharp.RuntimeBinder.RuntimeBinderException"," StackTrace&# 34;:"在CallSite.Target(Closure,CallSite,Object)
  在System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0,TRet](CallSite站点,T0 arg0)
  

中的XXXXAPI.PresentationLayer.Helpers.ActionResultGet.ExecuteAsync(CancellationToken cancellationToken)

正如你所看到的,我正在向HttpContent投射我的内容,显然这不是诀窍......如果我删除了演员,我仍然会得到同样的错误。如何将我的复杂类型纳入此内容?

public class ActionResultGet : IHttpActionResult
{
    private readonly HttpRequestMessage _request;
    private readonly dynamic _content;

    public ActionResultGet(HttpRequestMessage request, dynamic content)
    {
        _request = request;
        _content = content;
    }

    public Task<HttpResponseMessage> ExecuteAsync(
        System.Threading.CancellationToken cancellationToken)
    {
        if(_content == null)
        {
            var badResponse = new HttpResponseMessage()
            {
                StatusCode = HttpStatusCode.NotFound,
                Content = (HttpContent)this._content
            };

            return Task.FromResult(badResponse);
        }

        var response = new HttpResponseMessage()
        {
            StatusCode = HttpStatusCode.OK,
            Content = (HttpContent)this._content
        };

        return Task.FromResult(response);
    }
}

1 个答案:

答案 0 :(得分:1)

关于您的问题,理想情况下,您需要提供接受数据的ObjectContent以及内容协商格式化程序。

但是从上面的场景中,您无需在此处显式创建新类型的操作结果,因为默认情况下Web API提供此功能。例如,您可以查看System.Web.Http.Results.NegotiatedContentResult<T> ...通常您不会直接在控制器中使用此类型,而是使用Ok<T>StatusCode等帮助程序。任何控制器派生自ApiController的默认情况下获取这些助手。