Web Api IHttpActionResult HttpContent

本文关键字:HttpContent IHttpActionResult Api Web | 更新日期: 2023-09-27 17:50:45

我想让我所有的控制器调用返回一个IHttpActionResult,所以我做了一个实现这个接口的类。当有人进行GET调用时,显然一些复杂的数据将被发送回这个IHttpActionResult响应对象中的客户端。现在我有麻烦插入我的内容到我的HttpResponseMessage。当我调用其中一个GET方法时,我的错误是这样的。

{"消息":"发生错误","ExceptionMessage":"Cannot convert type 'XXXXX.DomainModels.News. "AllNewsItems'到'System.Net.Http.HttpContent'","ExceptionType":"Microsoft.CSharp.RuntimeBinder. "RuntimeBinderException","StackTrace":" at CallSite。Target(Closure, CallSite, Object)
在System.Dynamic.UpdateDelegates。updateanddexecute1 [T0,TRet](CallSite site, T0 arg0)
在XXXXAPI.PresentationLayer.Helpers.ActionResultGet。ExecuteAsync(CancellationToken CancellationToken) in

正如你所看到的,我正在将我的内容转换为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);
    }
}

Web Api IHttpActionResult HttpContent

关于您的问题,理想情况下您需要提供一个接受您的数据的ObjectContent和一个内容协商格式化器。

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