Blazor服务器,调用api控制器delete/{filename}来删除文件.404响应



我有一个api,它适用于大多数函数,但不适用于我的HttpDelete,在那里我得到了404响应。

[Route("/[controller]")]
[ApiController]
public class UploadController : ControllerBase

..
[HttpDelete("delete/{filename}")]
public IActionResult Delete(string filename)
{
try
{
var filePath = Path.Combine(grundPath, ulPath, filename);
if (System.IO.File.Exists(filePath))
{
System.IO.File.Delete(filePath);
return StatusCode(200);
}
}
catch (Exception ex)
{
return StatusCode(500, ex.Message);
}
return StatusCode(500);
}

我的Blazor组件:

..
@inject HttpClient Http
..
string url = $"delete/{filename}"
HttpResponseMessage response = await Http.DeleteAsync(url);
..

我已经尝试将url设置为$"https://localhost:XXXX/delete.....但结果相同。文件名的格式为";picture.png";

StatusCode:404,ReasonPhrase:"未找到",版本:1.1,内容:System.Net.Http.HttpConnectionResponse内容,标头:{设置Cookie:x-ms-gateway-slice=estsfd;路径=/;保护httponly日期。。。

我是api控制器的新手,所以我不知道我错过了什么。甚至不知道从哪里开始谷歌。。。

[编辑:将Swagger添加到项目中]

经过与Swagger的分析,我在招摇中得到了这个:

[DELETE]/DELETE/{filename}

添加了一个文件名并执行,得到了这个请求的url:

https://localhost:7285/delete/_eskilssk%C3%A4rmklipp.PNG

并且文件被删除。到目前为止还不错。

对此更改/添加代码:

string filename = WebUtility.UrlEncode(fil.Namn);
string baseUrl = $"https://localhost:7285/delete/{filename}";
await JsRuntime.ToastrSuccess("Info : " + baseUrl);
HttpResponseMessage response = await Http.DeleteAsync(baseUrl);

我的烤面包机给我:

https://localhost:7285/delete/_eskilssk%C3%A4rmklipp.PNG和招摇一样。。。

但这在我的输出i Visual studio中:

System.Net.Http.HttpClient.Default.LogicalHandler:信息:启动处理HTTP请求DELETEhttps://localhost:7285/delete/_eskilsskärmklipp.PNGSystem.Net.Http.HttpClient.Default.ClientHandler:信息:正在发送HTTP请求DELETEhttps://localhost:7285/delete/_eskilsskärmklipp.PNG

可能是我的编码错误吗?

我的程序.cs,可能顺序错误?

var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));
builder.Services.AddControllersWithViews()
.AddMicrosoftIdentityUI();
builder.Services.AddRazorPages();
builder.Services.AddAuthorization(options =>
{
options.FallbackPolicy = options.DefaultPolicy;
options.AddPolicy("Admin", policy => policy.RequireClaim("role", "Admin"));
});
builder.Services.AddAutoMapper(typeof(Program));
builder.Services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"));
}, ServiceLifetime.Transient);

builder.Services.AddServerSideBlazor()
.AddMicrosoftIdentityConsentHandler();
builder.Services.AddScoped<>(); // Some repositories
..
builder.Services.AddScoped<DialogService>();
builder.Services.AddScoped<NotificationService>();
builder.Services.AddScoped<TooltipService>();
builder.Services.AddScoped<ContextMenuService>();
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// 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.UseDeveloperExceptionPage();  // Remove when publish!!!
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.MapControllers();
app.MapDefaultControllerRoute();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Blazor API V1");
});
app.Run();

2022-11-10当我评论//应用程序时发现问题。使用身份验证和应用程序。使用授权我可以从我的组件访问API。这是一个安全问题,与最初的问题无关
使用更正确的信息开始新问题。

Blazor服务器和API在同一个项目中,404在应用程序时找不到。UserAuth正在激活

在ASP.NET Core中,操作的路由是:[controller]/[action]。在您的情况下:

/upload/delete/{filename}

客户端需要调用这个url,如:

..
@inject HttpClient Http
..
string url = $"upload/delete/{filename}"
HttpResponseMessage response = await Http.DeleteAsync(url);
..

如果您希望动作的url是delete/{filename},那么您可以通过/启动动作路由段。当动作路由段由/启动时,ASP.NET Core MVC将忽略控制器路由段,如:

[HttpDelete("/delete/{filename}")]
public IActionResult Delete(string filename)

最新更新