我希望我的所有控制器调用都返回一个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)
中的XXXXAPI.PresentationLayer.Helpers.ActionResultGet.ExecuteAsync(CancellationToken cancellationToken)
在System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0,TRet](CallSite站点,T0 arg0)
正如你所看到的,我正在向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);
}
}
答案 0 :(得分:1)
关于您的问题,理想情况下,您需要提供接受数据的ObjectContent
以及内容协商格式化程序。
但是从上面的场景中,您无需在此处显式创建新类型的操作结果,因为默认情况下Web API提供此功能。例如,您可以查看System.Web.Http.Results.NegotiatedContentResult<T>
...通常您不会直接在控制器中使用此类型,而是使用Ok<T>
,StatusCode
等帮助程序。任何控制器派生自ApiController的默认情况下获取这些助手。