根据 ASP.NET SPA 核心中的路由或域确定静态文件
Determine Static files based off route or domain in ASP.NET Core for SPA
在 ASP.NET Core 2 / 3 + 中是否可以 return 基于路由的不同静态文件?
例如:
app.domain.com
会为 public SPA (ReactJS / VueJS)
渲染一些 index.html
admin.domain.com
会为私人认证 SPA (Angular)
呈现一些其他 index.html
www.domain.com
将为 public 着陆页呈现第三个 index.html
我在文档中找不到方法 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-3.0
对于 return 基于域的不同内容,您可以尝试更改 UseStaticFiles
中的内容,例如
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = async ctx =>
{
var request = ctx.Context.Request;
string index = "";
if (request.Host.Host.Equals("app.domain.com") && request.Path.Value.Contains("index.html"))
{
index = Path.Combine(Directory.GetCurrentDirectory(),
"wwwroot", "PublicIndex.html");
}
else if (request.Host.Host.Equals("admin.domain.com") && request.Path.Value.Contains("index.html"))
{
index = Path.Combine(Directory.GetCurrentDirectory(),
"wwwroot", "PrivateIndex.html");
}
if (!String.IsNullOrEmpty(index))
{
var fileBytes = File.ReadAllBytes(index);
ctx.Context.Response.ContentLength = fileBytes.Length;
using (var stream = ctx.Context.Response.Body)
{
await stream.WriteAsync(fileBytes, 0, fileBytes.Length);
await stream.FlushAsync();
}
}
}
});
确保 wwwroot
文件夹中有默认 index.html。
您可以随时尝试自定义文件提供程序:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions<StaticFileOptions>()
.Configure<IHttpContextAccessor, IWebHostEnvironment>(
delegate(StaticFileOptions options, IHttpContextAccessor httpContext, IWebHostEnvironment env)
{
options.FileProvider = new ClientAppFileProvider (httpContext, env);
}
);
}
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
}
}
public class ClientAppFileProvider : IFileProvider
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IWebHostEnvironment _env;
public ClientAppFileProvider(IHttpContextAccessor httpContextAccessor, IWebHostEnvironment env)
{
_httpContextAccessor = httpContextAccessor;
_env = env;
}
public IDirectoryContents GetDirectoryContents(string subpath)
{
return _env.WebRootFileProvider.GetDirectoryContents(subpath); ;
} // End Function GetDirectoryContents
public IFileInfo GetFileInfo(string subpath)
{
string host = _httpContextAccessor.HttpContext.Request.Host.Host;
if (host.Equals("app.domain.com"))
{
subpath = Path.Combine("app", subpath);
}
else if (host.Equals("admin.domain.com"))
{
subpath = Path.Combine("admin", subpath);
}
else if (host.Equals("www.domain.com"))
{
subpath = Path.Combine("www", subpath);
}
// return _env.ContentRootFileProvider.GetFileInfo(subpath);
return _env.WebRootFileProvider.GetFileInfo(subpath);
}
public IChangeToken Watch(string filter)
{
return _env.WebRootFileProvider.Watch(filter);
} // End Function Watch
}
在 ASP.NET Core 2 / 3 + 中是否可以 return 基于路由的不同静态文件?
例如:
app.domain.com
会为 public SPA (ReactJS / VueJS)
index.html
admin.domain.com
会为私人认证 SPA (Angular)
index.html
www.domain.com
将为 public 着陆页呈现第三个 index.html
我在文档中找不到方法 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-3.0
对于 return 基于域的不同内容,您可以尝试更改 UseStaticFiles
中的内容,例如
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = async ctx =>
{
var request = ctx.Context.Request;
string index = "";
if (request.Host.Host.Equals("app.domain.com") && request.Path.Value.Contains("index.html"))
{
index = Path.Combine(Directory.GetCurrentDirectory(),
"wwwroot", "PublicIndex.html");
}
else if (request.Host.Host.Equals("admin.domain.com") && request.Path.Value.Contains("index.html"))
{
index = Path.Combine(Directory.GetCurrentDirectory(),
"wwwroot", "PrivateIndex.html");
}
if (!String.IsNullOrEmpty(index))
{
var fileBytes = File.ReadAllBytes(index);
ctx.Context.Response.ContentLength = fileBytes.Length;
using (var stream = ctx.Context.Response.Body)
{
await stream.WriteAsync(fileBytes, 0, fileBytes.Length);
await stream.FlushAsync();
}
}
}
});
确保 wwwroot
文件夹中有默认 index.html。
您可以随时尝试自定义文件提供程序:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions<StaticFileOptions>()
.Configure<IHttpContextAccessor, IWebHostEnvironment>(
delegate(StaticFileOptions options, IHttpContextAccessor httpContext, IWebHostEnvironment env)
{
options.FileProvider = new ClientAppFileProvider (httpContext, env);
}
);
}
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
}
}
public class ClientAppFileProvider : IFileProvider
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IWebHostEnvironment _env;
public ClientAppFileProvider(IHttpContextAccessor httpContextAccessor, IWebHostEnvironment env)
{
_httpContextAccessor = httpContextAccessor;
_env = env;
}
public IDirectoryContents GetDirectoryContents(string subpath)
{
return _env.WebRootFileProvider.GetDirectoryContents(subpath); ;
} // End Function GetDirectoryContents
public IFileInfo GetFileInfo(string subpath)
{
string host = _httpContextAccessor.HttpContext.Request.Host.Host;
if (host.Equals("app.domain.com"))
{
subpath = Path.Combine("app", subpath);
}
else if (host.Equals("admin.domain.com"))
{
subpath = Path.Combine("admin", subpath);
}
else if (host.Equals("www.domain.com"))
{
subpath = Path.Combine("www", subpath);
}
// return _env.ContentRootFileProvider.GetFileInfo(subpath);
return _env.WebRootFileProvider.GetFileInfo(subpath);
}
public IChangeToken Watch(string filter)
{
return _env.WebRootFileProvider.Watch(filter);
} // End Function Watch
}