我有asp.net核心应用程序.当存在异常时(在非开发环境中),configure方法的实现将用户重定向到"Error"页面
但是,只有在控制器内发生异常时,它才有效.如果异常发生在控制器之外,例如在我的自定义中间件中,则用户不会被重定向到错误页面.
如果中间件中存在异常,如何将用户重定向到"错误"页面.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseApplicationInsightsRequestTelemetry();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseApplicationInsightsExceptionTelemetry();
app.UseStaticFiles();
app.UseSession();
app.UseMyMiddleware();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
Run Code Online (Sandbox Code Playgroud)
更新1
我更新了上面的代码,其中包含初始帖子中缺少的以下两行.
app.UseSession();
app.UseMyMiddleware();
Run Code Online (Sandbox Code Playgroud)
另外我发现为什么app.UseExceptionHandler无法重定向到错误页面.
当我的中间件代码中有异常时,app.UseExceptionHandler("\Home\Error")重定向到\Home\Error预期; 但由于这是一个新请求,我的中间件再次执行并再次抛出异常.
所以为了解决这个问题,我改变了我的中间件只执行if context.Request.Path != "/Home/Error"
我不确定这是解决这个问题的正确方法,但是它的工作原理.
public class MyMiddleWare
{
private readonly RequestDelegate _next;
private readonly IDomainService _domainService;
public MyMiddleWare(RequestDelegate next, IDomainService domain)
{
_next = next;
_domainService …Run Code Online (Sandbox Code Playgroud) 我有ASP.NET核心Web应用程序.我已在Web服务器上配置Web应用程序并将ASPNETCORE_ENVIRONMENT变量设置为Development.我将此变量设置为机器级别,如下图所示.现在在同一台机器上,我想配置一个与Staging环境相同的Web应用程序实例.
我在这里设置ASPNETCORE_ENVIRONMENT应用程序级别而不是机器级别有什么选择?所以我可以在同一台机器上托管同一个应用程序的多个实例?
在我们的应用程序的每个SQL表中,我们都有"CreatedDate"和"ModifiedDate"列.我们正在使用DB第一种方法.当我保存数据时,我希望自动填充这两列.一种方法是getdate()在SQL表列本身上使用默认值.所以这将部分地解决问题.这意味着当实体是新的时,它将设置CreatedDate和ModifiedDate.但是,当我编辑/更新实体时,我只想ModifiedDate更新.
使用Code第一种方法有很多文章在做这件事.但我们正在使用DB第一种方法.
我有什么选择?
我有一个ASP.NET核心应用程序.该应用程序有很少的辅助类可以完成一些工作.每个类都有不同的签名方法.我在网上看到很多.net核心示例,它们为每个类创建接口,然后使用DI框架注册类型.例如
public interface IStorage
{
Task Download(string file);
}
public class Storage
{
public Task Download(string file)
{
}
}
public interface IOcr
{
Task Process();
}
public class Ocr:IOcr
{
public Task Process()
{
}
}
Run Code Online (Sandbox Code Playgroud)
基本上每个接口只有一个类.然后我用DI注册这些类型
services.AddScoped<IStorage, Storage>();
services.AddScoped<IOcr,Ocr>();
Run Code Online (Sandbox Code Playgroud)
但是我可以在没有接口的情况下注册类型,这样接口看起来多余 例如
services.AddScoped<Storage>();
services.AddScoped<Ocr>();
Run Code Online (Sandbox Code Playgroud)
所以我真的需要接口吗?
我有asp.net核心API应用程序,这是我第一次使用HangFire.
在.Net Core应用程序中,我的所有方法都是异步的.基于SO Post,wait()在hangfire中调用异步方法时使用它并不是一个好主意.
另外,根据v1.6.0中的hangfire支持问题,添加了异步支持.我使用的是1.6.12版,但我仍然没有看到异步支持.
我如何调用异步方法Enqueue.目前我正在使用wait()
public class MyController : Controller
{
private readonly Downloader _downlaoder;
private readonly IBackgroundJobClient _backgroungJobClient;
public MyController(Downloader downloader, IBackgroundJobClient backgroungJobClient)
{
_downlaoder = downloader;
_backgroungJobClient = backgroungJobClient;
}
[HttpPost]
public void Post([FromBody]IEnumerable<string> files)
{
_backgroungJobClient.Enqueue(() => _downloader.DownloadAsync(files).Wait());
}
}
Run Code Online (Sandbox Code Playgroud) 在 asp.net core 中,我可以使用中间件在此处描述的某些方法上启用 CORS
我想知道是否可以为任何方案和任何端口启用 CORS localhost(仅用于测试目的)。我试过通配符,但它不起作用
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
if(_environment.IsDevelopment())
{
options.AddDefaultPolicy(
builder =>
{
builder.WithOrigins("http://localhost/*",
"https://localhost/*");
});
});
}
else
{
options.AddDefaultPolicy(
builder =>
{
builder.WithOrigins("http://example.com",
"http://www.contoso.com");
});
});
}
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
Run Code Online (Sandbox Code Playgroud) 我有 .NET 4.5.2 应用程序用于SmtpClient发送电子邮件。该应用程序安装在Windows 2012 R2服务器上。当我禁用 TLS 1 和 TLS 1.1 并仅启用 TLS 1.2 时,应用程序停止发送邮件。我认为这是因为 .NET 4.5.2 不支持 v1.2。
我正在考虑以下步骤
1> 在 Windows Server 上禁用 TLS 1 和 TLS 1.1,仅启用 TLS 1.2。
2>在Windows服务器上安装.NET 4.8。
3>将应用程序的目标框架更改为4.8(在csproj和web.config中)并重新编译。
4>部署应用程序。
基于文档的 问题Starting with .NET Framework 4.7.1, WCF defaults to the operating system configured version
1>这仅适用于 WCF 还是 SMTP 也默认为操作系统配置的版本?
2> 或者我是否需要明确设置版本,例如System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
3> 现在是否可以设置版本 TLS 1.2,并且将来 TLS 1.3 可用时应用程序应自动默认为 TLS 1.3?(无需再次更改代码)
我试图安装serilog,我收到错误
PM> Install-Package Serilog
Install-Package:'Serilog'已经
为'Microsoft.CSharp'定义了一个依赖项.在行:1 char:1
+ Install-Package Serilog
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo:NotSpecified :( :) [Install-Package],出现InvalidOperationException
+ FullyQualifiedErrorId:NuGetCmdletUnhandledException,NuGet.PowerShell.Commands.InstallPackageCommand
Microsoft.CSharp 已在我的项目中引用
我们有现有的具有多个表名的数据库.例如Documents.我想使用新的EF Core和Asp.Net Core基于这篇文章与数据库的第一种方法在这里
我运行以下命令从现有数据库创建模型
Scaffold-DbContext"Server =(local); Database = MyDatabase; Trusted_Connection = True;"Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
但是,当我运行scaffolding命令时,它会创建具有多个名称的模型.例如,Documents表转换为模型名称Documents.
如何更改它以便它可以使用模型的单一命名约定?(我不能改变数据库中的表名)
请注意,我已经阅读了与相同问题相关的SO上的一些帖子,但他们主要关注代码第一种方法.我正在使用数据库第一种方法.
我有asp.net core 2 应用程序。根据文档,我.pubxml为我的开发环境创建了文件。我正在使用 Web 部署(远程代理)将 Web 包部署到目标 Web 服务器。在我们安装了 jenkins 的构建服务器上,我运行以下命令来构建和部署
D:\Jenkins\myproject\workspace\myapplication\Src\Api>dotnet publish Api.csproj /p:PublishProfile=development.pubxml
Run Code Online (Sandbox Code Playgroud)
它成功构建应用程序并将其部署到目标 Web 服务器。
但是,我的应用程序有多个appsettings特定于每个环境的文件。例如appsettings.json,appsettings.development.json,appsettings.staging.json和appsettings.production.json部署过程部署所有的AppSettings文件到Web服务器。(在这种情况下开发网络服务器)
我如何只包含特定于环境的 appsettings 文件?(在这种情况下,我想部署appsettings.json,appsettings.development.json但不是其他 2 个文件)
msbuild web-deployment-project web-deployment coreclr asp.net-core-2.0