小编Osk*_*erg的帖子

具有进程内托管的Dotnet核心多个启动类

我有一个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)

c# .net-core iis-express-10

13
推荐指数
1
解决办法
6551
查看次数

为什么在更改响应时AuthenticationManager.SignOut()失败?

我刚开始摆弄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中间件的源代码,但我仍然不熟悉该架构,我找不到我能掌握的答案.我需要你的帮助来解决这个问题,所以提前谢谢你!

asp.net-mvc owin katana asp.net-mvc-5

12
推荐指数
1
解决办法
5035
查看次数

四舍五入

我有这个"科学应用程序",其中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.

是否有或多或少"正确"的方式来处理这种情况,如果是这样,它可能是什么?

.net c#

10
推荐指数
1
解决办法
629
查看次数

避免在同一个DbContext上同时运行多个任务的实体框架错误

我在一个运行带有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(如上所述注入)是造成问题的原因.显然,这是一个意外的.

问题:

  1. 我得出了正确的结论,还是还有其他事情发生?
  2. 你能找出偶然发生错误的原因吗?
  3. 你知道在仍然运行并发任务的同时避免这个问题的任何简单方法DbContext吗?

c# sqlite dbcontext entity-framework-core .net-core

10
推荐指数
1
解决办法
5896
查看次数

为什么IEnumerable预测不可变?

假设我的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.相反,将它们输出到控制台将呈现:

默认值
默认值
默认值
默认值
默认值

(.NET小提琴)

从一些延迟执行的观点来看,这一切都很好,并且已经讨论过这个问题,就像这里这里一样.然而,我的问题是为什么枚举器实现不返回不可变对象; 如果不能保证几个枚举的持久性,那么设置值的能力有什么用,除了让人们感到困惑?

也许这不是一个很好的问题,但我相信你的答案会很有启发性.

c# linq

6
推荐指数
1
解决办法
1085
查看次数

集合初始化程序语法之间的区别

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 …

c# c#-6.0

5
推荐指数
1
解决办法
125
查看次数