這裏是一個解決方案,我在我的常見的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