我一直试图让它发挥作用,但没有运气。
我有中间件类用于验证上传的文件。
中间件调试进入Controller类后,但不进行操作。上下文请求在控制器的构造函数之后结束。
中间件类:
public class UploadMiddleware
{
public UploadMiddleware(RequestDelegate next)
{
_next = next;
}
[DisableFormValueModelBinding]
[ValidateAntiForgeryToken]
public async Task Invoke(HttpContext context)
{
var authToken = context.Request.Headers["id"].ToString();
var path = context.Request.Path.ToString();
var streamBody = context.Request.Body;
if (authToken != String.Empty)
{
if (!IsMultipartContentType(context.Request.ContentType))
{
await context.Response.WriteAsync("Unexpected error.");
await _next(context);
return;
}
var boundary = GetBoundary(context.Request.ContentType);
var reader = new MultipartReader(boundary, context.Request.Body);
// reader.HeadersLengthLimit = int.MaxValue;
// reader.BodyLengthLimit = long.MaxValue;
var section = await reader.ReadNextSectionAsync();
var buffer = new byte[256];
while (section != null)
{
var fileName = GetFileName(section.ContentDisposition);
var bytesRead = 0;
using (var stream = new FileStream(fileName,FileMode.Append))
{
do{
bytesRead = await section.Body.ReadAsync(buffer, 0, buffer.Length);
stream.Write(buffer, 0, bytesRead);
buffer = Convert.FromBase64String(System.Text.Encoding.UTF8.GetString(buffer));
} while (bytesRead < 0);
}
if (!verifyUpcomingFiles(buffer))
{
await context.Response.WriteAsync("Undefined file type detected.");
return;
}
else
{
context.Request.Headers.Add("isVerified","verified");
}
section = await reader.ReadNextSectionAsync();
}
}
else
{
await context.Response.WriteAsync("You are not allowed to complete this process.");
return;
}
await _next(context);
}
我陷入了这个问题。我真的需要有人指出我的方向,我将不胜感激。
答案 0 :(得分:0)
错误消息非常明确,docs也是如此,并在大红框中向您发出警告:
警告
在将响应发送到客户端后,请勿调用
next.Invoke
。响应开始后对HttpResponse
的更改将引发异常。例如,诸如设置标题,状态代码等的更改将引发异常。调用next
后写入响应正文:
可能导致协议违规。例如,写入超过规定的内容长度。
可能会损坏正文格式。例如,将HTML页脚写入CSS文件。
HttpResponse.HasStarted
是一个有用的提示,用于指示标题是否已发送和/或正文已写入。
if (!IsMultipartContentType(context.Request.ContentType))
{
await context.Response.WriteAsync("Unexpected error.");
// Here you're calling the next middleware after writing to the response stream!
await _next(context);
return;
}