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);
}
}
关于您的问题,理想情况下您需要提供一个接受您的数据的ObjectContent
和一个内容协商格式化器。
但是在上面的场景中,您不需要在这里显式地创建新类型的操作结果,因为默认情况下Web API提供了此功能。例如,你可以看看System.Web.Http.Results.NegotiatedContentResult<T>
…通常你不会使用这种类型直接在你的控制器,而是像Ok<T>
, StatusCode
等助手。任何从ApiController派生的控制器都默认得到这些帮助器。