Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC4 WebApi在响应头中添加ETag_C#_.net_Asp.net Mvc 4_Response_Etag - Fatal编程技术网

C# MVC4 WebApi在响应头中添加ETag

C# MVC4 WebApi在响应头中添加ETag,c#,.net,asp.net-mvc-4,response,etag,C#,.net,Asp.net Mvc 4,Response,Etag,我们在Mvc4中创建了一个REST服务 我试图在WebApi方法的响应中添加ETag头。它被添加到Header集合中,没有任何错误,但是当我在Fiddler中检查响应头时,它不在那里 下面是我用来在响应中写入头的方法: internal static HttpResponseMessage<T> GetResponse<T>(Tuple<T, Dictionary<string, string>> response) {

我们在Mvc4中创建了一个REST服务 我试图在WebApi方法的响应中添加ETag头。它被添加到Header集合中,没有任何错误,但是当我在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;
    }

您可以通过两种方式完成,您可以在ActionFilter.OnActionExecuted方法中设置ETag,如下所示:

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) {
    actionExecutedContext.ActionContext.Response.Headers.ETag = new EntityTagHeaderValue(...);
}
但是,无法轻松地将所需的值从控制器传递到ActionFilter。第二种方法是更改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;
}

您可以通过两种方式完成,您可以在ActionFilter.OnActionExecuted方法中设置ETag,如下所示:

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) {
    actionExecutedContext.ActionContext.Response.Headers.ETag = new EntityTagHeaderValue(...);
}
但是,无法轻松地将所需的值从控制器传递到ActionFilter。第二种方法是更改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;
}

如果我添加任何其他自定义标题,例如ClientId:1234,则返回该标题,但不返回ETag和日期标题。如果我添加任何其他自定义标题,例如ClientId:1234,则返回该标题,但不返回ETag和日期标题。