小编g.p*_*dou的帖子

在Identity Framework的方法中,HttpContext.Current为null

我正在使用ASP.NET MVC 5和Identity Framework.当我在ApplicationDbContext()上调用UserManager.UpdateAsync(...)我的事件处理程序时,将运行SaveChanges.这里我使用HttpContext.Current用于不同的目的(日志记录和审计)所以我必须说当前用户.但是整个方法在一个工作线程中运行,这里HttpContext.Current为null.

UserManager的"同步"方法最大的问题只是异步版本的包装,因此调用是序列化的,但方法(和事件处理程序)仍然在不同的工作线程中运行.

请注意,此问题与async/await上下文无关.在await之后的控制器中(或调用'sync'版本)我已经返回正确的HttpContext,即使控制器的方法在另一个线程中继续.没关系.

所以问题出在异步工作者中,它将同时在"同步"和异步版本中运行.我想我理解这种现象(但我对假'同步'方法版本不满意,真正的同步方法不会出现这个问题.)我只是不知道如何处理/解决它.

[btw:将UserManager的操作实现为简单的纯同步版本,然后用异步多线程包装器包装它们不是更自然吗?如果我们继续这种异步方式而不考虑我们将很快发明异步赋值运算符.这花了我几十个小时(只是这个问题),而且全世界都要花费数十亿美元,我相信在很多情况下,它的回报要低于它的价格.

额外奖励:我们所说的UserManager的影响非常小,但相同的原则和问题可以应用任何开箱即用的库(黑盒子),作者没有实现同步版本,或者不关心控制器线程的上下文.那么EF,它不是那么边缘......那么DI容器实例化基础设施如"请求范围"或"会话范围"呢?如果在没有HttpContext.Current的线程中进行解析,他们肯定会行为不端.最近我刷新了SendGrid NuGet,并且(作为一个突破性的变化)Deliver()方法消失了,现在只有DeliverAsync()存在...

我想有一个安全可靠的方法,如何访问此worker中的HttpContext以进行日志记录和审计.

示例代码,控制器'sync'版本:

[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Edit(ApplicationUser user)
{
    // validation etc
    // Update() seems to be only a poor wrapper around the async version, still uses a worker thread.
    var result = UserManager.Update(user);
    // Note: HttpContext is correct here so it is not an async/await problem

    // error handling, creating ActionResult etc.
}
Run Code Online (Sandbox Code Playgroud)

示例代码,控制器异步版本:

[AcceptVerbs(HttpVerbs.Post)]
public virtual async Task<ActionResult> Edit(ApplicationUser user)
{
    // validation etc
    var result = await …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc async-await asp.net-identity asp.net-identity-2

9
推荐指数
1
解决办法
1460
查看次数

如何使用命令行从本地缓存中清除特定的NuGet包?

是否可以使用命令行从NuGet本地缓存中清除特定的NuGet包?

上下文

我想确保在执行项目的包还原操作时,将恢复最新的服务器二进制文件,而不是缓存中的某些内容.同时我不想从缓存中删除所有包.

nuget nuget-package

9
推荐指数
1
解决办法
2243
查看次数

与默认方法和抽象类的接口,以及动机是什么?

上下文

我最近遇到过这个C#提议的默认界面方法 我已经阅读了规范,更重要的是阅读了动机.可能我错过了一些东西,但动机有点让我感到恶心.

接口和完全抽象类之间唯一的实际区别,未来的类可以实现(所以是[IS A])多个接口,但是只能从一个抽象类继承(所以是[IS A])(并且所有后果)

什么是不明确的,我就是用默认的方法抽象类和接口之间的确切区别现在,除了我们可以把多个(实现)继承到图片的默认方法,这是不可能的抽象类.(我不想打开问题/讨论是好还是坏,这不是这里的话题)

然而,动机谈论完全不同,三点:

  • "...... API作者在未破坏源代码的情况下在未来版本中向接口添加方法......".好的,"API"作者可以在未来的版本中添加方法,如果他实现它们而不破坏任何东西.
  • "......使C#能够与针对Android(Java)和iOS(Swift)的API互操作,......".我认为语言设计决策,尤其是关于抽象和OOP模式(如多重继承)的决策水平要高于与Swift的互操作性.我也认为,这只是互操作问题的0.0%,也可以通过其他方式解决.
  • "......事实证明,添加默认界面实现提供了"特征"语言特征的元素......".这是一个非常浅薄的陈述,特别是它指的是维基百科的"特征".根据定义,traits允许添加没有多重继承的方法(与super具有[IS A]关系).然而界面肯定是关于[IS A] ......不是说这个事实,特征至少是可以说是好的做法

我的问题是真正的差异(或动机)是什么,或者我缺少什么?

c# java

9
推荐指数
1
解决办法
846
查看次数

是否有任何约定或内置概念如何注入 Json 序列化程序?

语境

在我的 ASP.NET 项目序列化/反序列化 JSON 的某些类中,我认为使用静态JsonConvert...方法不是最佳选择,也不能new与硬编码类一起使用

我会在构造函数中注入一些东西吗?我是否必须为此目的定义我的自定义简单接口,或者是否有任何约定/内置概念如何不对类型进行硬编码?

c# dependency-injection json.net asp.net-core

9
推荐指数
1
解决办法
2742
查看次数

ASP.NET Core 中的 Serilog DI,要注入哪个 ILogger 接口?

语境

我已经在我的 ASP.NET Core 应用程序中成功配置了 Serilog,只剩下 DI 部分。

现在我有两个 ILogger 接口,一个Serilog.ILoggerMicrosoft.Extensions.Logging.ILogger. 两者都基于我的 Serilog 配置工作,但我不知道该使用哪个?(我的意思是,在 Serilog 配置到位后Microsoft.Extensions.Logging.ILogger也可以通过 Serilog 正确登录,所以我的配置很荣幸)

如果Microsoft.Extensions.Logging.ILogger我知道如何配置 DI 使其工作。但是,如果Serilog.ILogger我看到 Serilog 有一个静态 Log.Logger 实例(可能是单例)

我不想在我的代码中使用这个静态属性,主要是为了测试的原因,所以我想构造函数注入它。解决方案是:

services.AddSingleton(Log.Logger); // Log.Logger is a singleton anyway
Run Code Online (Sandbox Code Playgroud)

..但是当许多多个线程将同时使用这个非常相同的实例时,我担心 Web 应用程序中的这个单例。它是线程安全的吗?如果不是,那么Serilog.ILogger与 DI一起使用的解决方案是什么?

dependency-injection serilog asp.net-core

9
推荐指数
2
解决办法
4809
查看次数

.editorconfig 的 file_header_template 有哪些可用的宏?

我确实知道{filename}宏指的是 .editorconfig 中的实际文件名file_header_template。我想知道是否还有其他宏实用程序?

例如,我想插入当前年份。

macros visual-studio visual-studio-code editorconfig

9
推荐指数
0
解决办法
371
查看次数

如何通过Visual Studio中的Nuget获取最新的jQuery 1.x?

如何在Visual Studio中通过NuGet获取最新的jQuery 1.x(不是最新的2.x)?当我搜索NuGet时,Manage NuGet Packages窗口仅提供最新的2.x包.

Thx提前

asp.net asp.net-mvc jquery visual-studio

8
推荐指数
1
解决办法
5547
查看次数

如何在单元测试中模拟CRM插件沙箱隔离模式?

上下文

我想针对CRM 2016 CodeActivity和Plugin类将使用的类编写一些单元测试.最终的程序集将以沙箱隔离模式注册.

我想确定在运行单元测试时测试用例是否为绿色,在CRM中注册和运行时,沙箱隔离安全限制不会受到更多限制.

有没有办法在运行单元测试时模拟沙箱隔离?

unit-testing dynamics-crm

8
推荐指数
1
解决办法
522
查看次数

NSubstitute:如何访问返回中的实际参数

我想访问NSubstitute Returns方法中的实际参数.例如:

var myThing = Substitute.For<IMyThing>()
myThing.MyMethod(Arg.Any<int>).Returns(<actual parameter value> + 1)
Run Code Online (Sandbox Code Playgroud)

使用NSubstitute我应该代替什么<actual parameter value>,或者我如何实现等效行为?

c# unit-testing mocking nsubstitute

8
推荐指数
1
解决办法
2324
查看次数

使用 OpenApiReference,如何使用 .nswag json 选项文件(或任何替代文件)配置代码生成器选项

语境

我已将连接的服务添加到我的 .NET 6 项目中,并使用 NSwagCSharp 代码生成器来生成客户端。(在我之前的项目中我使用了NSwagStudio)

我发现在 .csproj 文件中可以添加选项:

<OpenApiReference Include="OpenAPIs\swagger.json" CodeGenerator="NSwagCSharp" ClassName="MyClient">
  <SourceUri>https://localhost:xxxx/swagger/v1/swagger.json</SourceUri>
  <Options>/UseBaseUrl:false /GenerateClientInterfaces:true /InjectHttpClient:false, /DisposeHttpClient:false,
  </Options>
</OpenApiReference>
Run Code Online (Sandbox Code Playgroud)

这些选项似乎与 NSwagStudio 保存到其 .nswag 文件中的选项非常相同。我不确定这只是一个猜测,其中一些到目前为止似乎有效。(这有记录在某处吗?)

然而 NSwagStudio 也保存默认值(我不知道是什么),所以在典型的 .nswag 文件中,json 中有大约 80 个设置:

"codeGenerators": {
 "openApiToCSharpClient": {
  ...
  "generateClientInterfaces": true,
  "clientBaseInterface": null,
  ... up to more than 80 lines...
Run Code Online (Sandbox Code Playgroud)

问题

<Options>这将导致.csproj 文件中的 element中出现很长的一行。(似乎不允许换行(?))。有没有办法使用外部选项文件(例如 json .nswag 文件)来配置代码生成选项?

.net openapi nswag nswagstudio

8
推荐指数
1
解决办法
3142
查看次数