Blazor 应用程序在 IIS 中托管时不加载页面



我正在尝试部署我的Blazor WebAssembly应用程序。. NET 5.0)到IIS服务器。当我加载页面时,我得到一个HTTP错误404。有了这个,还有一个API,我使用Swagger。我可以加载Swagger,也可以通过Postman查询API,只是Blazor UI没有加载。请问是什么原因造成的?

我已经在服务器上安装了。net Core Runtime Hosting Bundle。控制台中没有出现错误在目录 中存在Index.html如果我单独发布Blazor应用程序,则页面会加载(由于API尚未上传,因此会出现错误)。当我从Web API应用程序发布时,API工作,但Blazor不工作。

Blazor应用程序

。NET 5.0

网络。配置——

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".AppName.Server.dll" stdoutLogEnabled="false" stdoutLogFile=".logsstdout" hostingModel="inprocess" />
</system.webServer>

Program.cs——

public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

builder.RootComponents.Add<App>("app");

builder.Services.AddBlazoredLocalStorage();
builder.Services.AddAuthorizationCore();
builder.Services.AddScoped<AuthenticationStateProvider, ApiAuthenticationStateProvider>();
builder.Services.AddHttpClient<IAuthService, AuthService>();
builder.Services.AddScoped<DialogService>();
builder.Services.AddScoped<NotificationService>();
builder.Services.AddScoped<TooltipService>();
builder.Services.AddScoped<ContextMenuService>();
builder.Services.AddScoped<ClipboardService>();
await builder.Build().RunAsync();
}
Web API -

。NET 5.0

Startup.cs——

public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddServerSideBlazor();
services.AddMvc().AddNewtonsoftJson();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "AppTitle API", Version = "v1" });
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")).EnableDetailedErrors());
services.AddDefaultIdentity<IdentityUser>(options => options.Lockout.AllowedForNewUsers = false)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
var tokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = Configuration["JwtIssuer"],
ValidAudience = Configuration["JwtAudience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtSecurityKey"]))
};
services.AddSingleton(tokenValidationParameters);
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.SaveToken = true;
options.TokenValidationParameters = tokenValidationParameters;
});
services.AddResponseCompression(opts =>
{
opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
new[] { "application/octet-stream" });
});
services.AddCors(options =>
{
options.AddDefaultPolicy(
builder =>
{
builder.WithOrigins("https://localhost:44326",
"https://localhost:44345")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseDeveloperExceptionPage();
app.UseResponseCompression();
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), @"upload")),
RequestPath = new PathString("/upload") 
});
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("v1/swagger.json", "AppTitle API"));
app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute();
});

}
}

IIS中失败的请求跟踪

FRT中产生的唯一错误是-

  • -NOTIFY_MODULE_START
  • ModuleNameAspNetCoreModuleV2

    的通知EXECUTE_REQUEST_HANDLER

    fIsPostNotification假

    750

    女士警告103. -MODULE_SET_RESPONSE_ERROR_STATUS

    ModuleNameAspNetCoreModuleV2

    的通知EXECUTE_REQUEST_HANDLER

    HttpStatus404

    HttpReason没有找到

    HttpSubStatus0

    错误代码操作成功完成。(0 x0)

    ConfigExceptionInfo

    关于在IIS上部署Blazor WASM的404可能存在的问题之一是缺少URL重写模块。
    为了使用Blazor的路由系统,这个模块是必不可少的。

    更多信息请参考以下链接:https://learn.microsoft.com/en us/aspnet/core/blazor/host -和- deploy/webassembly?view=aspnetcore - 5.0 # rewrite-urls-for-correct-routing-1

    web . config已部署WASM应用程序的文件应该如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    <system.webServer>
    <staticContent>
    <remove fileExtension=".blat" />
    <remove fileExtension=".dat" />
    <remove fileExtension=".dll" />
    <remove fileExtension=".json" />
    <remove fileExtension=".wasm" />
    <remove fileExtension=".woff" />
    <remove fileExtension=".woff2" />
    <mimeMap fileExtension=".blat" mimeType="application/octet-stream" />
    <mimeMap fileExtension=".dll" mimeType="application/octet-stream" />
    <mimeMap fileExtension=".dat" mimeType="application/octet-stream" />
    <mimeMap fileExtension=".json" mimeType="application/json" />
    <mimeMap fileExtension=".wasm" mimeType="application/wasm" />
    <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
    <mimeMap fileExtension=".woff2" mimeType="application/font-woff" />
    </staticContent>
    <httpCompression>
    <dynamicTypes>
    <add mimeType="application/octet-stream" enabled="true" />
    <add mimeType="application/wasm" enabled="true" />
    </dynamicTypes>
    </httpCompression>
    <rewrite>
    <rules>
    <rule name="Serve subdir">
    <match url=".*" />
    <action type="Rewrite" url="wwwroot{R:0}" />
    </rule>
    <rule name="SPA fallback routing" stopProcessing="true">
    <match url=".*" />
    <conditions logicalGrouping="MatchAll">
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    </conditions>
    <action type="Rewrite" url="wwwroot" />
    </rule>
    </rules>
    </rewrite>
    </system.webServer>
    </configuration>
    

    相关内容

    最新更新