我有一个dotnet核心v.2.1应用程序,它利用"startup-class-by-environment-name-convention" Startup为不同的环境使用不同的类,例如开发,登台和生产.该Program.Main.CreateWebHost方法看起来类似于:
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
var startupAssembly = Assembly.GetExecutingAssembly();
var webHostBuilder = WebHost.CreateDefaultBuilder(args)
.UseStartup(startupAssembly.FullName);
return webHostBuilder;
}
Run Code Online (Sandbox Code Playgroud)
但是,在升级到dotnet core v.2.2(并且启动切换仍然很好)之后,我想尝试进程内托管功能.切换到进程内托管模型,并在Visual Studio 2017更新和IIS Express本地运行时,运行应用程序时出现此错误:
HTTP错误500.30 - ANCM进程内启动失败
这个问题的常见原因:
- 应用程序无法启动
- 应用程序启动但随后停止
- 应用程序启动但在启动期间抛出异常
故障排除步骤
- 检查系统事件日志以获取错误消息
- 启用日志记录应用程序进程的stdout消息
- 将调试器附加到应用程序进程并进行检查
有关更多信息,请访问:https://go.microsoft.com/fwlink/?LinkID = 2028265
我检查了所有日志,我能找到的就是:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="IIS Express AspNetCore Module V2" />
<EventID Qualifiers="0">1007</EventID>
<Level>2</Level>
<Task>0</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2018-12-14T10:37:48.327935100Z" />
<EventRecordID>3693</EventRecordID>
<Channel>Application</Channel>
<Computer>[whatever]</Computer>
<Security />
</System>
<EventData>
<Data>Application '/LM/W3SVC/2/ROOT' with physical root '[whatever again]' failed …Run Code Online (Sandbox Code Playgroud) 我刚开始摆弄OWIN/Katana和MVC.NET 5.0.默认的Visual Studio 2013 ASP.NET Web应用程序/ MVC模板具有一个带有LogOut()操作的AccountController:
public ActionResult LogOff() {
AuthenticationManager.SignOut();
return RedirectToAction("Index", "Home");
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这很好用.但是,当我更改响应状态代码时,例如:
Response.SetStatus(HttpStatusCode.SeeOther);
Run Code Online (Sandbox Code Playgroud)
... AuthenticationManager.SignOut()方法不再导致用户注销.这是为什么?
我尝试了不同的方法来设置响应的http状态代码,以及更改像"位置"这样的http标头,并且始终具有相同的结果 - 当执行LogOff()操作时,如果我进入回火状态,则用户不会注销随着回应.
我尝试不使用RedirectToAction(它显式实现302重定向 - 这是另一个故事),而不是返回ActionResult,但这没有任何区别 - 不是我真的希望它.
使用Fiddler我可以看出浏览器看起来的响应看起来很好,没有任何意外.
我也尝试在工作中查看OWIN中间件的源代码,但我仍然不熟悉该架构,我找不到我能掌握的答案.我需要你的帮助来解决这个问题,所以提前谢谢你!
我有这个"科学应用程序",其中Single值应该在UI中呈现之前进行舍入.根据这篇MSDN文章,由于"精度损失",该Math.Round(Double, Int32)方法有时会"意外地"表现,例如将2.135舍入到2.13而不是2.14.
据我了解,这个问题与"银行家的四舍五入"无关(参见例如这个问题).
在应用中,有人显然选择了通过显式转换来解决这个问题Single,以一个Decimal舍入(即之前Math.Round((Decimal)mySingle, 2))来调用Math.Round(Decimal, Int32)过载来代替.除了可能出现的二进制到十进制转换问题之外,OverflowException如果该Single值太小或太大而不适合该Decimal类型,则该"解决方案"也可能导致抛出.
Math.Round(Double, Int32)如果转换失败,捕获此类错误以返回结果,并不会使我成为完美的解决方案.也不会重写应用程序以便一直使用Decimal.
是否有或多或少"正确"的方式来处理这种情况,如果是这样,它可能是什么?
我在一个运行带有Sqlite的Entity Framework Core的Dotnet Core项目中有一个WebApi控制器.
动作中的此代码会出现错误:
var t1 = _dbContext.Awesome.FirstOrDefaultAsync(a => [...]);
var t2 = _dbContext.Bazinga.FirstOrDefaultAsync(b => [...]);
var r1 = await t1;
var r2 = await t2;
Run Code Online (Sandbox Code Playgroud)
错误是:
Microsoft.EntityFrameworkCore.Query.RelationalQueryCompilationContextFactory:错误:迭代查询结果时数据库中发生异常.System.ObjectDisposedException:已关闭安全句柄
Microsoft.EntityFrameworkCore.Query.RelationalQueryCompilationContextFactory:错误:迭代查询结果时数据库中发生异常.System.InvalidOperationException:只能在连接打开时调用ExecuteReader.
对我来说,这两个错误都表明了一些事情正在发生DbContext,比如过早处置(尽管不是DbContext自己).该DbContext被注入在使用DOTNET核心的"通常方式"的管道控制器的构造,配置如下所示(从我的Startup.cs ConfigureServices方法体):
services.AddDbContext<ApplicationContext>(options => options.UseSqlite(connectionString));
Run Code Online (Sandbox Code Playgroud)
如果我将上面的错误产生代码改为:
var r1 = await _dbContext.Awesome.FirstOrDefaultAsync(a => [...]);
var r2 = await _dbContext.Bazinga.FirstOrDefaultAsync(b => [...]);
Run Code Online (Sandbox Code Playgroud)
...我没有看到提到的错误,因此得出的结论是,在我的同一个实例上同时运行多个任务DbContext(如上所述注入)是造成问题的原因.显然,这是一个意外的.
问题:
DbContext吗?假设我的Awesome类有一个属性Bazinga,String默认值为"默认值",我可以去:
var enumerableOfAwesome = Enumerable
.Range(1, 5)
.Select(n => new Awesome());
foreach (var a in enumerableOfAwesome)
a.Bazinga = "New value";
Run Code Online (Sandbox Code Playgroud)
正如你可能已经意识到的enumerableOfAwesome那样,如果你希望找到你的"新价值"字符串安全隐藏在所有的中,那么再次枚举就不会让你开心Bazinga.相反,将它们输出到控制台将呈现:
默认值
默认值
默认值
默认值
默认值
从一些延迟执行的观点来看,这一切都很好,并且已经讨论过这个问题,就像这里和这里一样.然而,我的问题是为什么枚举器实现不返回不可变对象; 如果不能保证几个枚举的持久性,那么设置值的能力有什么用,除了让人们感到困惑?
也许这不是一个很好的问题,但我相信你的答案会很有启发性.
MSDN声明:
通过使用集合初始值设定项,您不必在源代码中指定对类的Add方法的多个调用; 编译器添加调用.
他们也给出了这个例子,使用带括号的更新的集合初始化语法:
var numbers = new Dictionary<int, string> {
[7] = "seven",
[9] = "nine",
[13] = "thirteen"
};
Run Code Online (Sandbox Code Playgroud)
但是,在检查生成的IL代码时,似乎这段代码根本不会导致对该Add方法的任何调用,而是对一个调用set_item,例如:
IL_0007: ldstr "seven"
IL_000c: callvirt instance void class [mscorlib]System.Collections.Generic.Dictionary`2<int32, string>::set_Item(!0/*int32*/, !1/*string*/)
Run Code Online (Sandbox Code Playgroud)
相反,带有大括号的"旧"语法给出以下内容:
// C# code:
var numbers2 = new Dictionary<Int32, String>
{
{7, "seven"},
{9, "nine"},
{13, "thirteen"}
};
// IL code snippet:
// ----------
// IL_0033: ldstr "seven"
// IL_0038: callvirt instance void class [mscorlib]System.Collections.Generic.Dictionary`2<int32, string>::Add(!0/*int32*/, !1/*string*/)
Run Code Online (Sandbox Code Playgroud)
......正如您所看到Add的,正如预期的那样,调用结果就是结果.(人们只能假设上面提到的MSDN上的文本尚未更新.)
到目前为止,我发现了一个这种差异实际上很重要的案例,那就是古怪System.Collections.Specialized.NameValueCollection …