es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

TypeError: Error al recuperar con Edge y Blazor

Tengo una aplicación WPA Blazor con una API ASP.NET MVC en el backend.

Tengo un proceso de importación y carga de archivos que puede durar bastante tiempo (más de 20 minutos). He establecido el tiempo de espera de HTTPContext en 30 minutos (en la página Razor). Pero alrededor de los 4-5 minutos en el proceso, obtengo el siguiente error (el texto es de la Consola de Herramientas para Desarrolladores de Microsoft Edge):

El acceso a la URL ‘https://myapp.azurewebsites.net/fileupload?aimporttype=InsertProduction&ausername=’ desde el origen ‘https://myapp.azurewebsites.net’ ha sido bloqueado por la política CORS: no se ha encontrado la cabecera ‘Access-Control-Allow-Origin’ en el recurso solicitado. Si una respuesta opaca satisface sus necesidades, establezca el modo de la solicitud en ‘no-cors’ para obtener el recurso con CORS desactivado.

Pensé que había abordado este problema en el siguiente código:

Este es el archivo de inicio de la API:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("CorsPolicy",
            builder => builder
                .AllowAnyMethod()
                .AllowCredentials()
                .SetIsOriginAllowed((host) => true)
                .AllowAnyHeader());
    });

    services.AddDbContext<ProductionContext>(opt => opt.UseSqlServer(AppSettings.Instance.GetConnection("SQLAZURE_Connection")));

    services.AddControllersWithViews()
        .AddNewtonsoftJson(options =>
            options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
    );

    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(options =>
    {
        Configuration.Bind("AzureAd", options);
        options.TokenValidationParameters.RoleClaimType = "http://schemas.microsoft.com/ws/2008/06/identity/claims/role";
    },
    options => { Configuration.Bind("AzureAd", options); });

    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "ProductionAPI", Version = "v1" });
    });

    services.AddControllers();

    AppSettings.Instance.SetConfiguration(Configuration);
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment() || env.IsProduction())
    {
        app.UseDeveloperExceptionPage();
        app.UseSwagger();
        app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "ProductionAPI v1");
            c.RoutePrefix = "";     // Shows the SwaggerUI page
        });
    }

    app.UseHttpsRedirection();

    app.UseRouting();
    app.UseCors("CorsPolicy");

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

Y mi llamada SubmitFileAsync desde el cliente:

public async Task SubmitFileAsync()
{
try
{
if (string.IsNullOrEmpty(_selectionValue))
{
_importSelectionCheckVisible = true;
return;
}

        _uploadResult = "Cargando archivo...";

        var lContent = new MultipartFormDataContent();
        lContent.Add(
            content: _fileStream,
            name: "\"file\"",
            fileName: _selectedFileName);

        string lUri = settings.ApiUrl + $"fileupload?aimporttype={_selectionValue}&ausername={loginState.Username}";

        HttpResponseMessage lResponse = await http.PostAsync(lUri, lContent);
        if (lResponse.IsSuccessStatusCode)
        {
            var lJsonString = lResponse.Content.ReadAsStringAsync();
            ImportResults AImportResults =
                System.Text.Json.JsonSerializer.Deserialize<ImportResults>(lJsonString.Result);

            _importVisibility = "visibility: visible";
            _importRowCount = AImportResults.ImportRowCount.ToString();
            _totalRowsAdded = AImportResults.TotalRowsAdded.ToString();
            _totalRowsSkipped = AImportResults.TotalRowsSkipped.ToString();
            _carriersCreated = AImportResults.CarriersCreated.ToString();
            _insuranceTypesCreated = AImportResults.InsuranceTypesCreated.ToString();
            _transactionTypesCreated = AImportResults.TransactionTypesCreated.ToString();
            _totalRecordsImported = AImportResults.TotalRecordsImported.ToString();
            _importSuccess = AImportResults.Success;
            _duplicateRecords = AImportResults.DuplicatesDetected.ToString();

            _uploadResult = "Carga completa";
            StateHasChanged();
        }
        else
        {
            _uploadResult = $"Tipo y/o formato de archivo inválido.";
        }

    }
    catch (Exception ex)
    {
        _uploadResult = "Seleccione un archivo CSV para cargar.";
        _error = ex.Message;
    }
}

¿Qué me está faltando aquí?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Es posible que necesite agregar el encabezado Access-Control-Allow-Origin a su respuesta. Puede hacerlo agregando el siguiente código a su método Configure en la clase Startup:

    app.Use(async (context, next) =>
    {
    context.Response.Headers.Add(“Access-Control-Allow-Origin”, “*”);
    await next();
    });

Comments are closed.