我正在使用Amazon S3为我的网站提供静态资产.我想让浏览器尽可能长时间地缓存这些资产.我应该在资产中包含哪些元数据标头
Cache-Control: max-age=???
Run Code Online (Sandbox Code Playgroud) 我有一个ASP.Net Web API控制器,它只返回用户列表.
public sealed class UserController : ApiController
{
[EnableTag]
public HttpResponseMessage Get()
{
var userList= this.RetrieveUserList(); // This will return list of users
this.responseMessage = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ObjectContent<List<UserViewModel>>(userList, new JsonMediaTypeFormatter())
};
return this.responseMessage;
}
}
Run Code Online (Sandbox Code Playgroud)
和一个动作过滤器属性类EnableTag,负责管理ETag和缓存:
public class EnableTag : System.Web.Http.Filters.ActionFilterAttribute
{
private static ConcurrentDictionary<string, EntityTagHeaderValue> etags = new ConcurrentDictionary<string, EntityTagHeaderValue>();
public override void OnActionExecuting(HttpActionContext context)
{
if (context != null)
{
var request = context.Request;
if (request.Method == HttpMethod.Get)
{
var …Run Code Online (Sandbox Code Playgroud) 我在ASP.NET核心2.0中有过滤器属性,请参阅下面的我的代码片段.这里的问题是我总是得到状态码是200.
即使实际状态代码是500,那么我也得到200.如何获得实际状态代码?
public void OnActionExecuted(ActionExecutedContext context)
{
try
{
var controller = context.Controller as APIServiceBase;
var statusCode = controller.Response.StatusCode;
..
..
}
catch { }
}
Run Code Online (Sandbox Code Playgroud) 在管道的顶部Startup.Configure,我创建了一个自定义中间件,它处理我的 asp net core 应用程序的错误,如下所示:
public class ErrorHandlerMiddleware
{
private readonly RequestDelegate _next;
public ErrorHandlerMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception)
{
if (context.Response.StatusCode != (int)HttpStatusCode.ServiceUnavailable && context.Response.StatusCode != (int)HttpStatusCode.InternalServerError)
{
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
}
}
finally
{
if (context.Response.StatusCode / 100 != (int)HttpStatusCode.OK / 100)
{
string message = ((HttpStatusCode)context.Response.StatusCode) switch
{
HttpStatusCode.ServiceUnavailable => "The application is currently on maintenance. Please try again later.", …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置一个动作过滤器,只有StatusCode在HttpContext.Response302 的情况下才会执行某些操作.
我希望能够在OnActionExecuting方法中做到这一点,但StatusCode总是如此200.
ActionFilter 码:
public class CustomFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
// do some setup
}
public void OnActionExecuted(ActionExecutedContext context)
{
if (context.HttpContext.Response.StatusCode == StatusCodes.Status302Found)
{
// never get here
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的Action方法:
public IActionResult Redirect()
{
return RedirectToAction("Index", "Home");
}
Run Code Online (Sandbox Code Playgroud)
和注册ActionFilter在startup:
public void ConfigureServices(
IServiceCollection services)
{
services.AddMvc(
options =>
{
options.Filters.Add(new CustomFilter());
});
}
Run Code Online (Sandbox Code Playgroud)
我已经检查了浏览器,它正确返回302并进行重定向.我也试过使用IAsyncActionFilter …