这里是一个解决方案,我在我的常见的Web API 2库代码中使用,可以轻松支持设置任何头 - 或者在ExecuteAsync
提供--without被捆绑到任何具体的HttpResponseMessage
任何其他属性衍生NegotiatedContentResult
实现:
public class FlexibleNegotiatedContentResult<T> : NegotiatedContentResult<T>
{
private readonly Action<HttpResponseMessage> _responseMessageDelegate;
public FlexibleNegotiatedContentResult(HttpStatusCode statusCode, T content, IContentNegotiator contentNegotiator, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
: base(statusCode, content, contentNegotiator, request, formatters)
{
}
public FlexibleNegotiatedContentResult(HttpStatusCode statusCode, T content, ApiController controller, Action<HttpResponseMessage> responseMessageDelegate = null)
: base(statusCode, content, controller)
{
_responseMessageDelegate = responseMessageDelegate;
}
public override async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
HttpResponseMessage responseMessage = await base.ExecuteAsync(cancellationToken);
if (_responseMessageDelegate != null)
{
_responseMessageDelegate(responseMessage);
}
return responseMessage;
}
}
和用法的例子:
new FlexibleNegotiatedContentResult<string>(HttpStatusCode.Created, "Entity created!", controller, response => response.Headers.Location = new Uri("https://myapp.com/api/entity/1"));
我考虑去一个不同的路线,因为我不希望延长所有内置的响应。我目前的想法是有一个'HttpResponseHeaders'字典,我将它合并到消息处理程序中的IHttpActionResult中。这似乎工作,除了没有响应头的构造函数。 – ehdv
您可以查看我对其他评论的回复。你的方法是不正确的。 –
我用这个例子不断得到“406不可接受”,直到我用引号将值包裹起来:即用'string.Format(“\”{0} \“”,this.ETagValue)'替换'this.ETagValue'''。我试图添加内容类型参数(profile =“http:/ ...” - 必须引用href),我实际上偶然发现了这个解决方案。 – biscuit314