c# - Stream的意外结束,内容可能已被另一个组件读取

时间:2017-11-23 20:07:42

标签: c# asp.net asp.net-core

我一直试图让它发挥作用,但没有运气。

我有中间件类用于验证上传的文件。

中间件调试进入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);


    }

我陷入了这个问题。我真的需要有人指出我的方向,我将不胜感激。

1 个答案:

答案 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;
}