C# 304对Owin的响应
使用Owin中间件执行304响应的正确方法是什么 我正在这么做C# 304对Owin的响应,c#,owin,C#,Owin,使用Owin中间件执行304响应的正确方法是什么 我正在这么做 public override Task Invoke(IOwinContext context) { var response = context.Response; response.ContentType = "application/javascript"; response.StatusCode = 200; if (ClientCached(context.Request, script
public override Task Invoke(IOwinContext context)
{
var response = context.Response;
response.ContentType = "application/javascript";
response.StatusCode = 200;
if (ClientCached(context.Request, scriptBuildDate))
{
response.StatusCode = 304;
response.Headers["Content-Length"] = "0";
return null;
}
response.Headers["Last-Modified"] = scriptBuildDate.ToUniversalTime().ToString("r");
return context.Response.WriteAsync(js);
}
返回
null
对于空体响应正确吗?它可以工作,但我想知道它应该如何设置才能完全符合规范。您应该使用Stream.Null
,因为这是表示无主体场景的理想方式
public override Task Invoke(IOwinContext context)
{
var response = context.Response;
response.ContentType = "application/javascript";
if (ClientCached(context.Request, scriptBuildDate))
{
response.StatusCode = 304;
//Close the existing body just in case
response.Body.Close();
response.Body = Stream.Null;
return Task.FromResult<Object>(null);
}
else
{
response.StatusCode = 200;
response.Headers["Last-Modified"] = scriptBuildDate.ToUniversalTime().ToString("r");
return context.Response.WriteAsync(js);
}
}
公共覆盖任务调用(IOwinContext上下文)
{
var-response=context.response;
response.ContentType=“应用程序/javascript”;
if(ClientCached(context.Request,scriptBuildDate))
{
response.StatusCode=304;
//关闭现有主体,以防万一
response.Body.Close();
response.Body=Stream.Null;
返回Task.FromResult(空);
}
其他的
{
response.StatusCode=200;
response.Headers[“Last Modified”]=scriptBuildDate.ToUniversalTime().ToString(“r”);
返回context.Response.WriteAsync(js);
}
}
@Anders对不起我的错误。您可以像以前一样返回null,也可以返回已完成的任务,例如task.FromResult(null)。返回的实际值不是响应的一部分,而是一个“同步点”(标准异步/等待代码)。您以前的解决方案按预期工作,因为主体流为空。所以它没有向响应写入任何内容,将body stream设置为stream。Null告诉Owin您的目标是没有body。谢谢,在iisreset之后,我有时会得到500,如果内容没有修改,因此当ClientCached时执行的代码不正确,将尝试Task.FromResult(Null)看看它是否修复了由于某种原因(但不总是)导致500的问题Return null,前提是我之前进行了iireset,并且客户端缓存部分已经执行。Task.FromResult(null)修复了500个问题。如果您将OWIN框架添加到解决方案中,那么您可以在这些情况下抛出HttpException,它将返回您在异常中设置的任何http状态代码。