请考虑示例C#控制台应用程序中的服务和组件的以下方案
public interface IService { }
public class FooService: IService { }
public class BarService: IService { }
public class BuzzService: IService { }
public class AwesomeService: IService { }
public class Consumer
{
public Consumer(IEnumerable<IService> services)
{
// do some initilization work here...
}
}
public class AnotherConsumer
{
public AnotherConsumer(IEnumerable<IService> services)
{
// do some initilization work here...
}
}
Run Code Online (Sandbox Code Playgroud)
让我们假设在组合根目录中进行以下注册:
var container = new WindsorContainer();
container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel, true));
container.Register(Component.For<IService>().ImplementedBy<FooService>());
container.Register(Component.For<IService>().ImplementedBy<BarService>());
container.Register(Component.For<IService>().ImplementedBy<BuzzService>());
container.Register(Component.For<IService>().ImplementedBy<AwesomeService>());
container.Register(Component.For<Consumer>());
container.Register(Component.For<AnotherConsumer>());
// consumer got …Run Code Online (Sandbox Code Playgroud) 我们正在将一些 .NET 应用程序从完整框架迁移到 .NET 核心,并且我们正在尝试找出这样做的最佳方法。
主要变化之一是与应用程序配置方式相关的变化。在 .NET 完整框架中,我们曾经将应用程序设置放在 app.config 文件中,并通过ConfigurationManager 类读取它们。
我知道 .NET 核心支持基于 nuget 包Microsoft.Extensions.Configuration和各种配置源包的新配置系统。但是,与此同时,Microsoft 通过 nuget 包System.Configuration.ConfigurationManager将对 ConfigurationManager 类的支持扩展到 .NET 核心。
以下是我的问题:
这个问题与 ASP.NET core 2.2 Web 应用程序(针对 .NET core)相关,该应用程序公开了一些使用 mvc 中间件实现的 Web api 控制器。所有控制器中可用的所有操作方法都必须响应 GET 和 HEAD http 方法。
我们注意到 ASP.NET Core 自动添加Transfer-Encoding带有值的标头chunked,并根据规范省略标Content-Length头(有关更多详细信息,请参阅此 MDN 页面)。
根据ASP.NET core 存储库上的这个 github 问题,这种行为似乎取决于 Kestrel Web 服务器的精确设计决策,因此这是预期的行为。
也就是说,每次我们向应用程序的任何路由发出 HEAD 请求时,Content-Length即使相应的 GET 请求(我的意思是具有相同路径的 GET 请求)返回非空响应正文,我们也会得到标头设置为 0 的响应。
根据我在各种来源上读到的内容,似乎Content-Length标头对于 HEAD 请求的响应不是必需的,但当包含标头时,它应该具有与相应 GET 请求相同的值。因此,我们在每个 HEAD 请求上看到的值0对我来说似乎不正确。
Transfer-Encoding对于相应的 GET 请求,ASP.NET Core 通过使用块发送响应(如上所述,总是chunked针对 GET 请求),这是否是事实的副作用?
另一个疑问与向我们的应用程序发出 HEAD 请求的任何类型的缓存有关,以便决定是否清除缓存的响应:零值 Content-Length 是否会对缓存行为的正确性带来风险? …
http browser-cache http-content-length asp.net-core asp.net-core-webapi
我知道这个问题有点毫无意义,因为在 Javascript 中字符串是不可变的,所以从某种意义上说,知道它们是被建模为 值类型还是引用类型并不是那么有用。
所以,把我的问题当作好奇:Javascript 中的字符串文字是值类型还是引用类型?
因为我知道在术语方面存在很多混淆,所以我想澄清引用类型和值类型的含义。
当我说引用类型时,我指的是分配给变量的值实际上是对内存中对象的引用的类型。例如,对象文字会发生这种情况:
const myObject = {foo: "bar"};
const anotherObject = myObject; // both the variables myObject and anotherObject are references to the same memory address. Only one object exists in memory
Run Code Online (Sandbox Code Playgroud)
另一方面,当我说值类型时,我指的是分配给变量的值是表示变量预期值的真实数据(而不是指向包含真实数据的内存地址的指针)的类型。例如,布尔值会发生这种情况:
const myBoolean = true;
const anotherBoolean = true; // here both of the variables contain the actual data (which is the intended boolean value of the variable). …Run Code Online (Sandbox Code Playgroud) 我正在使用一个 angular SPA,它通过使用身份服务器 4和oidc 客户端 js来实现身份验证。
有些东西在静默访问令牌更新级别不起作用。预期的行为是访问令牌的自动更新,这要归功于调用/connect/authorize端点的 iframe 。此调用将身份服务器身份验证 cookie 与 HTTP 请求一起发送,这样做身份服务器知道用户会话仍然有效并且能够发出新的访问令牌,而无需用户再次交互登录。到目前为止,我很确定我的理解是正确的。
这是棘手的部分:我的期望是身份服务器身份验证 cookie 应该有一个滑动到期时间,以便每次调用/connect/authorize端点时其到期日期都会及时向前移动。换句话说,我预计在用户第一次登录后不需要用户进行其他交互式登录,因为每次静默更新 iframe 需要新的访问令牌时,用户会话到期日期都会自动向前移动.
为了获得这种行为,我在身份服务器级别设置了以下配置。
这是客户端配置(注意访问令牌生命周期为 2 分钟 = 120 秒):
new Client
{
ClientId = "web-client",
ClientName = "SPA web client",
AllowedGrantTypes = GrantTypes.Code,
RequireClientSecret = false,
RequirePkce = true,
RequireConsent = false,
AccessTokenLifetime = 120,
RedirectUris = { "https://localhost:4200/assets/signin-callback.html", "https://localhost:4200/assets/silent-callback.html" },
PostLogoutRedirectUris = { …Run Code Online (Sandbox Code Playgroud) 使用 kestrel 从 Visual Studio 2019 启动 ASP.NET core 3.1 Web 应用程序时,我遇到了奇怪的行为(我的意思是不使用IIS Express 的启动配置文件)。
我创建了一个最小的应用程序来重现该问题。
操作系统:Windows 10(内部版本 19041.746) Visual Studio 版本:Visual Studio 2019 版本 16.8.4
这是 csproj 文件:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
这是 launchSettings.json 文件:
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:52222",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "weatherforecast",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"TestWebApplication": {
"commandName": "Project",
"launchBrowser": …Run Code Online (Sandbox Code Playgroud) c# .net-core kestrel-http-server asp.net-core asp.net-core-3.1
我正在使用一个支持取消的异步 api,我正在向该 api 传递一个CancellationToken实例。像往常一样,如果在传递的令牌上请求取消,我正在调用的 api 将抛出一个OperationCanceledException(这是 .NET 框架的标准合作取消模式)。
我希望能够捕获OperationCanceledException 当且仅当它是由于取消提供的取消令牌而引发的异常时。
以下代码说明了我要实现的目标:
try
{
await _service.DoSomethingAsync(cancellationToken: token);
}
catch (OperationCanceledException ex) when ( /* here I want a condition signifying that the OperationCanceledException is caused by the cancellation of the token object */)
{
// avoid logging the exception: this is raised by design (cooperative cancellation)
throw;
}
catch (Exception ex)
{
_logger.LogError(ex, "An error occurred: {0}", ex.Message);
throw;
}
Run Code Online (Sandbox Code Playgroud)
对于上面代码的异常过滤器,我基本上有两个想法:
IsCancellationRequested属性token …这个问题具体指的是ASP.NET core 3.1和内置的依赖注入容器(Microsoft DI)。
此Microsoft 文档和此 stackoverflow 问题IEnumerable<TService>确认,当为同一服务类型注册多个实现类型时,Microsoft DI 容器始终通过遵守注册顺序进行解析。订单是有保证的,并且有明确的记录。
有谁知道该方法是否同样适用IServiceProvider.GetServices<T>()?
如果上述问题的答案是肯定的,那么即使在以下示例中(同一类的两个不同实例注册为同一服务类型的实现),这也成立吗?
public interface IService {}
public sealed class Foo : IService {}
var foo1 = new Foo();
var foo2 = new Foo();
services.AddSingleton<IService>(foo1);
services.AddSingleton<IService>(foo2);
var implementations = serviceProvider.GetServices<IFoo>();
// is it guaranteed that implementations[0] == foo1 and implementations[1] == foo2 ???
Run Code Online (Sandbox Code Playgroud) c# dependency-injection .net-core asp.net-core asp.net-core-3.1
我正在使用 ASP.NET core 3.1,并从 Visual Studio 2019 内置 ASP.NET core Web api 模板开始编写 Web api。
我的一项服务依赖于该IHttpClientFactory服务。我正在使用指定的客户端消费模式。所以,基本上,我有这样的代码:
var client = _httpClientFactory.CreateClient("my-client-name");
Run Code Online (Sandbox Code Playgroud)
我注意到,即使使用不存在的 HTTP 客户端的名称,前面的方法调用也能工作。我所说的不存在的 HTTP 客户端是指从未在方法内部定义的命名 HTTP 客户端Startup.ConfigureServices。
换句话说,我希望下面的代码会抛出,但实际上它不会:
// code in Startup.ConfigureServices
services.AddHttpClient("my-client-name", c =>
{
c.DefaultRequestHeaders.Add("User-Agent", "UserAgentValue");
});
// code in a custom service. I would expect this line of code to throw
var client = _httpClientFactory.CreateClient("not-existing-client");
Run Code Online (Sandbox Code Playgroud)
是否可以配置 ASP.NET core 3.1 应用程序,使其IHttpClientFactory具有严格的行为,并且像前一个应用程序那样的代码会抛出异常,指出请求的命名客户端未定义?
c# .net-core asp.net-core asp.net-core-3.1 ihttpclientfactory
我知道,在使用 Microsoft 依赖项注入容器时,处理 HttpClient 实例的最佳做法是使用Microsoft.Extensions.Http nuget 包提供的IHttpClientFactory 接口。
不幸的是,实现IHttpClientFactory 接口的类不是公开的(您可以在此处验证),因此利用此模式的唯一方法是使用 Microsoft 依赖项注入容器(至少这是我所知道的唯一一个)。有时我需要使用不同的容器维护旧的应用程序,因此即使无法使用 IHttpClientFactory 方法,我也需要找出最佳实践。
正如这篇著名文章中所述并在 Microsoft 文档中也得到证实, HttpClient 类旨在在每个应用程序生命周期内实例化一次,并在多个 HTTP 调用中重用。这可以安全地完成,因为用于发出 HTTP 调用的公共方法被记录为线程安全的,因此可以安全地使用单例实例。在这种情况下,请务必遵循本文中给出的提示,以避免与 DNS 更改相关的问题。
到现在为止还挺好。
有时使用BaseAddress或DefaultRequestHeaders 之类的属性很方便,它们不是线程安全的(至少,它们没有被记录为线程安全,所以我假设它们不是)来配置 HttpClient 实例。
这就提出了一个问题:如果我有一个单独的 HttpClient 实例并且在我的代码中的某处我使用属性DefaultRequestHeaders来设置一些常见的 HTTP 请求标头,这对调用我的应用程序需要与之通信的主机之一有用,会发生什么?这是潜在的危险,因为不同的主机可能需要相同请求标头的不同值(以身份验证为例)。此外,由于缺乏线程安全保证,从两个线程同时修改DefaultRequestHeaders可能会扰乱 HttpClient 实例的内部状态。
由于所有这些原因,我认为使用 HttpClient(当 IServiceCollection 不可用时)的最佳方法如下:
为应用程序需要与之通信的每个主机创建一个 HttpClient 实例。对一个特定主机的每次调用都将使用 HttpClient 的相同实例。对同一主机的并发调用是安全的,因为用于执行调用的方法的线程安全性已记录在案。
为应用程序需要与之通信的每个主机创建一个服务。HttpClient 实例被注入到这个服务中,并且服务本身在应用程序中被用作单例。该服务用于抽象出对其耦合的主机的访问。像这样的类是完全可测试的,如图所示 …
我正在使用 .NET core 3.1、C#8 和可空引用类型。
从我正在编写的类库中,我引用了NewtonsoftJson 包的12.0.3版。
我注意到通过调用JsonConvert.DeserializeObject<T>我可以获得一个空引用(Visual Studio 分析器检测到一个可能的空引用取消引用)。
请注意,我正在调用带有字符串和JsonSerializerSettings. 我只是使用JsonSerializerSettings来处理可能的反序列化错误(通过Error 属性)。
github 源代码确认我正在调用的重载可以通过MaybeNull属性返回空引用:查看此处进行确认。
我的问题是:在哪些情况下,newtonsoft JSONnull在将 JSON 字符串反序列化为 .NET 类型时会返回引用?
通常它返回一个给定类型的对象,或者它的属性为它们的类型的默认值,我从来没有遇到过null返回的情况。
I'm new to Mass Transit and I would like to understand if it can helps with my scenario. I'm building a sample application implemented with a CQRS event sourcing architecture and I need a service bus in order to dispatch the events created by the command stack to the query stack denormalizers.
Let's suppose of having a single aggregate in our domain, let's call it Photo, and two different domain events: PhotoUploaded and PhotoArchived.
Given this scenario, we …
c# ×8
.net-core ×7
asp.net-core ×4
http ×2
.net ×1
angular ×1
app-config ×1
async-await ×1
c#-8.0 ×1
cancellation ×1
cqrs ×1
javascript ×1
json.net ×1
masstransit ×1
rabbitmq ×1
servicebus ×1