Контроллер ASP.NET Core 8.0 веб-приложения Blazor не находит маршрут

Как использовать контроллеры в веб-приложении Blazor? Мой маршрут не найден.

Невозможно найти локальную страницу хоста

структура папок с файлами

У меня в AddControllers есть MapControllers и program.cs.

Я хочу иметь возможность добавить простой маршрут к этому контроллеру, чтобы проверить, как загружать файлы, но я не могу маршрутизироваться к этому контроллеру, когда ввожу URL-адрес.

Я не уверен, чего мне не хватает и как вызвать контроллер. Я сделал карту и добавил контроллеры, но это ничего не дало.

using Microsoft.AspNetCore.Mvc;
using System.IO.Compression;

namespace SecureFileShare.Controllers
{
    public class HomeController : ControllerBase
    {
        [ApiController]
        [Route("api/[controller]")]
        public class FilesController : ControllerBase
        {
            private readonly IWebHostEnvironment _hostEnvironment;

            public FilesController(IWebHostEnvironment hostEnvironment)
            {
                _hostEnvironment = hostEnvironment;
            }

            [HttpGet]
            [Route("download-zip")]
            public IActionResult DownloadFiles()
            {
                try
                {
                    var folderPath = Path.Combine(_hostEnvironment.ContentRootPath, "FilesToDownload");

                    // Ensure the folder exists
                    if (!Directory.Exists(folderPath))
                        return NotFound("Folder not found.");

                    // Get a list of files in the folder
                    var files = Directory.GetFiles(folderPath);

                    if (files.Length == 0)
                        return NotFound("No files found to download.");

                    // Create a temporary memory stream to hold the zip archive
                    using (var memoryStream = new MemoryStream())
                    {
                        // Create a new zip archive
                        using (var zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
                        {
                            foreach (var file in files)
                            {
                                var fileInfo = new FileInfo(file);

                                // Create a new entry in the zip archive for each file
                                var entry = zipArchive.CreateEntry(fileInfo.Name);

                                // Write the file contents into the entry
                                using (var entryStream = entry.Open())
                                using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
                                {
                                    fileStream.CopyTo(entryStream);
                                }
                            }
                        }

                        memoryStream.Seek(0, SeekOrigin.Begin);

                        // Return the zip file as a byte array
                        return File(memoryStream.ToArray(), "application/zip", "files.zip");
                    }
                }
                catch (Exception ex)
                {
                    return StatusCode(500, $"An error occurred: {ex.Message}");
                }
            }
        }
    }
}
using SecureFileShare.Client.Pages;
using SecureFileShare.Components;

using Microsoft.AspNetCore.Authentication.Negotiate;
using Microsoft.AspNetCore.Components.Server.Circuits;
using Microsoft.Extensions.DependencyInjection.Extensions;
using SecureFileShare.Services;

var builder = WebApplication.CreateBuilder(args);


// For windows authentication 
// ---------------------
// First add nuget package Microsoft.AspNetCore.Authentication.Negotiat
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
   .AddNegotiate();

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = options.DefaultPolicy;
});

// Add services to the container.
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents()
    .AddInteractiveWebAssemblyComponents();

// Inject IHttpContextAccessor
builder.Services.AddHttpContextAccessor();

// Injects
builder.Services.AddScoped<UserService>();
builder.Services.TryAddEnumerable(
    ServiceDescriptor.Scoped<CircuitHandler, UserCircuitHandler>());


builder.Services.AddControllers();  ///I ADDED CONTROLLER HERE

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseWebAssemblyDebugging();
}
else
{
    app.UseExceptionHandler("/Error", createScopeForErrors: true);
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles();
app.UseAntiforgery();

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

app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode()
    .AddInteractiveWebAssemblyRenderMode()
    .AddAdditionalAssemblies(typeof(SecureFileShare.Client._Imports).Assembly);

app.MapControllers();   ///I MAPPED CONTROLLER HERE

app.Run();

У вас есть FilesController, вложенный в HomeController. Я не верю, что это разрешено.

Michael Roy 12.06.2024 19:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не уверен, чего мне не хватает и как заставить контроллер работать. называется. Я сделал карту и добавил контроллеры, которые не принесли что-либо.

Судя по вашему общему фрагменту кода и описанию, проблема заключается во вложенности вашего класса FilesController. Потому что в настоящее время у вас есть FilesController, вложенный в HomeController. Это неверно, поскольку контроллеры должны быть отдельными классами.

Я воспроизвел проблему соответствующим образом, как вы можете видеть ниже:

Чтобы решить эту проблему, ваш fileController должен иметь собственный класс, а не быть вложенным в класс HomeController.

Просто создайте еще один класс контроллера с самим FilesController. Вы можете сделать следующее:

[ApiController]
[Route("api/[controller]")]
public class FilesController : ControllerBase
{
    private readonly IWebHostEnvironment _hostEnvironment;

    public FilesController(IWebHostEnvironment hostEnvironment)
    {
        _hostEnvironment = hostEnvironment;
    }

    [HttpGet]
    [Route("download-zip")]
    public IActionResult DownloadFiles()
    {
        
    }
}

Выход:

Запрос был отмечен действием download-zip, как и ожидалось.

Примечание. Пожалуйста, обратитесь к этому официальному документу . Также маршрутизация в веб-API.

Меня всегда цепляют невероятно простые вещи. Спасибо за хороший ответ. Я проголосовал за, но у меня нет репутации, позволяющей это учитывать, но там сказано, что это зарегистрировано. еще раз спасибо

Quinn Nash 13.06.2024 16:15

Спасибо за ваш ответ, я рад помочь вам в этом.

Md Farid Uddin Kiron 14.06.2024 02:44

Другие вопросы по теме