gpt4 book ai didi

asp.net-mvc - 如何在 Action 中获取和设置 http header ,可测试的方式

转载 作者:行者123 更新时间:2023-12-01 04:21:39 31 4
gpt4 key购买 nike

我有一个返回 FileContentResult 或 NotModifiedResult 的操作,这是一个自定义结果类型,返回 HTTP 304 以指示请求的资源尚未被修改,如下所示:

[ReplaceMissingPicture(Picture = "~/Content/Images/nothumbnail.png", MimeType = "image/png")]
public ActionResult Thumbnail(int id)
{
var item = Service.GetItem(id);

var requestTag = Request.Headers["If-None-Match"] ?? string.Empty;
var tag = Convert.ToBase64String(item.Version.ToArray());

if (tag == requestTag)
{
return new NotModifiedResult();
}

if (item.Thumbnail != null)
{
var thumbnail = item.Thumbnail.ToArray();
var mime = item.PictureMime;

Response.AppendHeader("ETag", tag);

return File(thumbnail, mime);
}
else
{
return null;
}
}

此操作需要访问 Response 对象,该对象在测试期间当然不存在,因此使此操作无法测试。我可以在它周围添加条件语句,以便它在测试期间运行,但是我无法测试是否正确设置了标题。

这个问题的解决方案是什么?

仅供引用,如果此操作返回 null,则 ReplaceMissingPicture 过滤器将返回特定资源,以出于同样的原因将 MapPath() 调用保持在 Controller 之外。

最佳答案

第一步是创建一个界面来简化您需要的服务:-

  public interface IHeaders
{
public string GetRequestHeader(string headerName);
public void AppendResponseHeader(string headerName, string headerValue);
}

现在创建一个默认实现:-
 public Headers : IHeaders
{
public string GetRequestHeader(string headerName)
{
return HttpContext.Current.Request[headerName];
}
public void AppendResponseHeader(string headerName, string headerValue)
{
HttpContext.Current.Response.AppendHeader(headerName, headerValue);
}
}

现在向您的 Controller 添加一个新字段:-
     private IHeaders myHeadersService;

向您的 Controller 添加新的构造函数:-
     public MyController(IHeaders headersService) 
{
myHeadersService = headersService;
}

修改或添加默认构造函数:-
    public MyController()
{
myHeadersService = new Headers();
}

现在在您的操作代码中使用 myHeadersService 而不是 Response 和 Request 对象。

在您的测试中创建您自己的 IHeaders 的实现模拟/测试 Action 代码并在构造 Controller 时传递该实现的接口(interface)。

关于asp.net-mvc - 如何在 Action 中获取和设置 http header ,可测试的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1445838/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com