2

Mvc4 で作成された REST サービスがあります。 WebApi メソッドからの応答に ETag ヘッダーを追加しようとしています。エラーなしでヘッダー コレクションに追加されますが、Fiddler で応答ヘッダーを確認すると、そこにはありません。

応答にヘッダーを書き込むために使用した方法は次のとおりです。

    internal static HttpResponseMessage<T> GetResponse<T>(Tuple<T, Dictionary<string, string>> response)
    {
        HttpResponseMessage<T> httpResponse = new HttpResponseMessage<T>(response.Item1, HttpStatusCode.OK);

        if (response.Item2 != null)
        {
            foreach (var responseHeader in response.Item2)
            {
                if (string.Compare(responseHeader.Key, "ETAG", StringComparison.OrdinalIgnoreCase) == 0)
                {
                    httpResponse.Headers.ETag = new System.Net.Http.Headers.EntityTagHeaderValue("\"" + responseHeader.Value + "\"");
                }
                else
                {
                    httpResponse.Headers.Add(responseHeader.Key, responseHeader.Value);
                }
            }
        }

        return httpResponse;
    }
4

1 に答える 1

4

2 つの方法で行うことができます。次のように ActionFilter.OnActionExecuted メソッドで ETag を設定できます。

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) {
    actionExecutedContext.ActionContext.Response.Headers.ETag = new EntityTagHeaderValue(...);
}

しかし、目的の値をコントローラーから ActionFilter に簡単に渡す方法はありません。2 つ目の方法は、WebAPI アクションを変更することです。モデル タイプを返す代わりに、HttpResponseMessage を返します。

[HttpGet]
public HttpResponseMessage MyActionMethod() {
    var result = // response data
    var response = Request.CreateResponse<MyType>(HttpStatusCode.OK, result);
    response.Headers.Add("Last Modified", result.Modified.ToString("R"));
    response.Headers.ETag = new System.Net.Http.Headers.EntityTagHeaderValue(CreateEtag(result));
    return response;
}
于 2013-03-06T19:24:29.647 に答える