502错误上传csv文件到web api

时间:2018-03-08 11:44:29

标签: node.js iis-7.5 angular5 asp.net-core-2.0

我有一个带文件上传功能的Angular5用户界面。用户单击一个按钮并选择一个文件,该文件将被发送到web api(asp.NET Core)方法进行处理。

这适用于较小的文件,但对于较大的文件,请求会因502错误而超时。

我可以看到请求总是超时120秒。 (注意:我通过开发中的节点和生产中的IIS进行托管)。

对于大文件,我需要将此超时扩展为更大的值。我试图通过多种方式实现这一目标:

  1. 请求标头 - 角度代码中的请求超时。我使用以下代码尝试设置超时标头值,但它不会影响120秒:

    export class AuthTokenInterceptor implements HttpInterceptor {
    
    constructor(private authContext: AuthContext) {
    }
    
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        const authHeaderValue = this.authContext.getAuthenticationHeaderValue(req.url);
    
        if (authHeaderValue) {
            const authReq = req.clone({  headers:
              req.headers.set('Authorization', authHeaderValue)
                         .set('Timeout', '100000000000000000') });
    
            return next.handle(authReq);
        }
        return next.handle(req);
    }    }
    
  2. web.config - 我尝试将web.config文件中的httpRuntime超时值设置为以下值(但仍然在120秒时超时):

                                                                                                                                          

  3. 在IIS中 - 我尝试在IIS中设置“限制”属性的配置,并且在120秒时仍然超时(这与我没有任何关联)通过节点服务器运行。)

  4. enter image description here

    有没有人能够在他们的Angular(2+)应用请求中修改这120秒?

    提前感谢任何指示!

    注意:为了完整性,这是我的asp.net核心,上传的控制器方法:

    [HttpPost("Upload")]
    public async Task<IActionResult> UploadAsync(IFormFile file)
    {
        // Ensure the file has contents before processing.
        if (file == null || file.Length == 0)
            throw new ApiException("Csv file should not be null", HttpStatusCode.BadRequest)
                .AddApiExceptionResponseDetails(ErrorTypeCode.ValidationError, ErrorCode.BelowMinimumLength, SOURCE); 
    
        // Ensure the file is not over the allowed limit.
        if (file.Length > (_settings.MaxCsvFileSize * 1024))
            throw new ApiException("Max file size exceeded, limit of " + _settings.MaxCsvFileSize + "mb", HttpStatusCode.BadRequest)
                .AddApiExceptionResponseDetails(ErrorTypeCode.ValidationError, ErrorCode.ExceedsMaximumLength, SOURCE); 
    
        // Ensure the file type is csv and content type is correct for the file.
        if (Path.GetExtension(file.FileName) != ".csv" || 
            !Constants.CsvAcceptedContentType.Contains(file.ContentType.ToLower(CultureInfo.InvariantCulture)))
                throw new ApiException("Csv content only accepted").AddApiExceptionResponseDetails(ErrorTypeCode.ValidationError, ErrorCode.Invalid, SOURCE);
    
        // Read csv content.
        var content = await file.ReadCsvAsync<OrderCsvResponseDto>() as CsvProcessedResponseDto<OrderCsvResponseDto>;
    
        await ProcessBulkUpload(content);
    
        // Return information about the csv file.
        return Ok(content);
    }
    

    注意 - 当我通过IIS Express运行web api然后超时时,我使用命令主机运行它并且它没有超时 - 似乎这可能与各种IIS设置有关。 web api没有web.config文件,因为我使用的是新版本的ASP.net Core,但是当我运行它时,这段代码似乎对IIS Express没有任何影响:

          var host = new WebHostBuilder()
                    .UseStartup<Startup>()
                    .UseKestrel(o => {
    
                        o.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(10);
                        o.ShutdownTimeout = TimeSpan.FromMinutes(10);
                        o.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(10);
    
                    })
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseIISIntegration()
                    .UseApplicationInsights()
                    .Build();
    

1 个答案:

答案 0 :(得分:3)

如果其他人遇到我遇到的同样问题,我会在这里发布。事实证明,在IIS Express(或托管的IIS)中运行配置设置会覆盖代码中的任何内容(可能这是因为较新版本的.net Core在项目中没有web.config文件 - 我不确定。

无论如何,我通过执行以下步骤解决了这个问题:

在任务栏中打开IIS Express

enter image description here

单击您正在运行的应用程序(并希望延长请求超时)。 单击该应用程序将显示该应用程序的配置文件。双击打开配置文件。

enter image description here

将以下设置应用于aspNetCore部分:

将requestTimeout =&#34; 00:20:00&#34;

示例:

if

那就是它!

注意:我在PaaS ASE中托管应用程序 - 因此无法在此直接配置IIS。我的解决方案是将web.config文件添加到api项目,并在其中应用我的设置。构建过程尊重web.config,而不是动态生成一个,它将保留所需的更改。就我而言,web.config看起来像这样:

   <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" forwardWindowsAuthToken="false" requestTimeout="00:20:00" stdoutLogEnabled="false" />
      <httpCompression>
        <dynamicCompression>
          <add mimeType="text/event-stream" enabled="false" />
        </dynamicCompression>
      </httpCompression>
    </system.webServer>

希望这有助于其他人!