Как использовать контроллеры в веб-приложении 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. Потому что в настоящее время у вас есть 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.
Меня всегда цепляют невероятно простые вещи. Спасибо за хороший ответ. Я проголосовал за, но у меня нет репутации, позволяющей это учитывать, но там сказано, что это зарегистрировано. еще раз спасибо
Спасибо за ваш ответ, я рад помочь вам в этом.
У вас есть FilesController, вложенный в HomeController. Я не верю, что это разрешено.