小编Ily*_*dik的帖子

使用泛型处理 C# 8 可为空引用类型中的不一致行为

我有这个代码:

public T? Foo<T>()
    where T : class?
{
    return null;
}
Run Code Online (Sandbox Code Playgroud)

它给出了一个符合逻辑和预期的错误:

可以为 null 的类型参数必须是值类型或不可为 null 的引用类型。考虑添加“类”、“结构”或类型约束。

现在我再添加一个约束:

public T? Foo<T>()
    where T : class?, IDisposable // Could be any interface I guess
{
    return null;
}
Run Code Online (Sandbox Code Playgroud)

现在有趣的是,错误刚刚消失。尽管在我看来我们确实存在相互冲突的约束,因为接口是non-nullalbewhileclass?是。

我在这里遗漏了什么还是编译器有问题?

c# generics nullable-reference-types

4
推荐指数
1
解决办法
150
查看次数

如何覆盖 Azure Web App 自定义部分中的 web.config 值?

在 Azure Web App 中可以轻松覆盖 web.config AppSettings 部分。例如,如果我有以下 web.config:

<appSettings>   
    <add key="AllowedCORSOrigin" value="http://localhost:26674"/>
</appSettings>
Run Code Online (Sandbox Code Playgroud)

我可以在门户中的应用程序设置 UI 中覆盖它,如下所示:

在此处输入图片说明

我在 web.config 中还有一个自定义部分:

<AdWordsApi>
    <add key="OAuth2RefreshToken" value="TOKEN" />
</AdWordsApi>
Run Code Online (Sandbox Code Playgroud)

是否也可以以某种方式覆盖它?我试过AdWordsApi.OAuth2RefreshTokenand AdWordsApi:OAuth2RefreshToken,但这并不容易。

PS 有趣的是知道其他自定义部分是否可能,例如,如果我想在服务器上使用另一种身份验证模式。

<system.web>
    <authentication mode="None" />
</system.web>
Run Code Online (Sandbox Code Playgroud)

web-config environment-variables azure azure-web-app-service

3
推荐指数
1
解决办法
7120
查看次数

现代浏览器是否缓存ajax响应?

我最近发现,我们Cache-Control:no-cache在所有WebApi响应中都使用了它。我知道在浏览器缓存发生变化之前,您永远都不知道浏览器是否可以缓存json,因此这很重要。

据我所记得,目前还没有现代浏览器在缓存ajax响应,因此不需要此标头。但是我真的很想再次检查一下,并在这里询问一下行为,因为找不到有关该主题的最新文章。

所以问题实际上是:我们是否仍需要设置Cache-Control:no-cacheSPA应用程序的Web api调用,如果是,那么哪些浏览器进行缓存?

ajax cache-control browser-cache asp.net-web-api single-page-application

3
推荐指数
1
解决办法
1484
查看次数

使用 BodyType - String 由旧库 (Microsoft.ServiceBus.Messaging) 读取的新库 (Microsoft.Azure.ServiceBus) 发送消息

我有一个前段时间写的客户端,它使用旧库并GetBody<string>()在接收消息时调用读取正文。

现在我有了新客户端Microsoft.Azure.ServiceBus(发送消息),据我所知它总是使用Stream.

所以旧客户端只是因为它期望字符串主体类型而崩溃。我发现了很多关于相反场景(新读者,旧作者)的信息,但无法弄清楚如何让新客户端以所需格式发送数据。

相关链接:

  1. 一个stackoverflow答案
  2. 互操作扩展做相反的事情(在新客户端阅读旧消息)

.net servicebus azure azureservicebus

3
推荐指数
1
解决办法
693
查看次数

如何在 C# 8 中允许可空泛型类型作为方法的返回类型?

我有以下代码:

public async Task<T> Retrieve<T>()
    where T : class, ITableEntity
{
    var result = await GetData<T>();
    return result.Result as T; // result.Result is object
}
Run Code Online (Sandbox Code Playgroud)

现在编译器给出警告Possible null reference return。我可以用 '!' 修复它,但我实际上确实想允许 null,所以这样做似乎是错误的。我真的不知道为什么编译器会假设该类表示不可为空,我尝试编写class?(甚至不知道这意味着什么,但它可以编译,尽管它给出了相同的警告)。

是否可以告诉编译器 T 可以是可为空的引用类型?我猜它默认为不可为空。

c# generics nullable-reference-types

3
推荐指数
1
解决办法
525
查看次数

在简单注入器中注册为singleton的两个接口的类的行为是什么

我有以下课程:

public class UserService : IUserService, IObserver<User>
Run Code Online (Sandbox Code Playgroud)

我已注册IUserService为Singleton UserService.之后我以IObserver这种方式注册:

container.RegisterManyForOpenGeneric(typeof(IObserver<>),
    container.RegisterAll,
    typeof(IObserver<>).Assembly);
Run Code Online (Sandbox Code Playgroud)

所以现在如果我注入IEnumerable<IObservable>我的复合模式,当我将枚举时,我会得到与解析时相同的对象IUserService吗?

它似乎以这种方式工作(只有一个UserService存在的对象),至少如果我解决了IEnumerable第一个问题.我无法在文档中找到它,但这是Simple Injector支持的功能还是可以随时更改的巧合?如果是,那么我猜这个行为对于任何两个或更多接口是相同的,不一定是开放通用的?

c# dependency-injection simple-injector

2
推荐指数
1
解决办法
573
查看次数

枚举多次的.Net方法应接受哪种类型的集合作为参数?

我有一个简单的方法是这样的:

private void CalculateTotals(IEnumerable<MyData> data)
{
   decimal value1 = data.Sum(d => d.Value1);
   decimal value2 = data.Sum(d => d.Value2);
}
Run Code Online (Sandbox Code Playgroud)

这可以正常工作,并允许传入任何类型的集合,但是这也将执行多个数据枚举,而这可能也非常昂贵。

现在,我可以将参数的类型更改为,ICollection<MyData>但这意味着调用者不知道该方法是否可以/将更改集合,因为可以对其进行调用Add/Remove

我的下一个猜测IReadonlyCollection<MyData>似乎是最合适的,但这意味着每个调用者都必须创建/转换为new ReadonlyCollection

.net中是否有解决此问题的“首选”方法?

.net c# enumerable

2
推荐指数
1
解决办法
91
查看次数

如何将依赖注入与.net core JwtBearerOptions.Events一起使用?

.Net Core ApiJwtBearer看起来像这样:

_services
    .AddJwtBearer(options =>
     {
        options.Events.OnAuthenticationFailed += MyMethod;
     });
Run Code Online (Sandbox Code Playgroud)

它实际上只是一个函数。现在我想使用ILogger服务配置中的一个,以便在记录失败的身份验证请求时使用。ILogger问题是我目前没有 的实例,而且我也没有真正看到获取它或使用工厂方法的好方法,因为我ServiceProvider两者都没有。

我已经这样解决了:

var loggerForAuthentication = _services.BuildServiceProvider().GetService<ILogger>();
Run Code Online (Sandbox Code Playgroud)

这将构建整个 DI 容器以返回我的ILogger. 这种方法有一些缺点,例如为这个确切的服务构建器生成它自己的单例,并且看起来也不正确。

还有其他方法可以做到这一点吗?

c# logging dependency-injection jwt asp.net-core

2
推荐指数
1
解决办法
1710
查看次数

上课做什么?(带问号的类)在 C# 泛型类型约束中是什么意思?

当我试图找到另一个问题的答案时,我注意到这段代码是用 C# 编译的:

public void Foo<T>(T obj)
    where T : class?
{
}
Run Code Online (Sandbox Code Playgroud)

我没有设法在文档中找到它甚至意味着什么。

PS 显然有人决定结束一个问题,甚至没有弄清楚“重复”并没有真正联系起来。首先尝试解决问题而不是结束问题有那么难吗?副本是关于可为空的原始类型,而可为空的引用类型则完全不同。除了有人看到他们都有一个问号并将问题标记为重复。

c# generics c#-8.0 nullable-reference-types

2
推荐指数
1
解决办法
416
查看次数

无法为 cosmos db 分配 Azure 角色

我正在尝试为一个身份分配一个角色来读取/写入cosmos db。我运行这个命令:

az role assignment create \
--assignee <sp_object_id> \
--role "00000000-0000-0000-0000-000000000002" \
--scope "/subscriptions/<subscriptionId>/resourceGroups/<resource-group-name>/providers/Microsoft.DocumentDB/databaseAccounts/<cosmos-db-name>"
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

The specified role definition with ID '00000000000000000000000000000002' does not exist.
Run Code Online (Sandbox Code Playgroud)

我尝试过使用角色名称,但无济于事。我已经尝试过 GUI,但这个角色在任何地方都看不到。

我该如何分配这个角色?

azure azure-cli azure-cosmosdb

2
推荐指数
1
解决办法
3343
查看次数

应为 Azure 服务总线中的 AMQP 连接打开哪些端口?

我找到了有关 AMQP 所使用端口的文档:

Azure 服务总线始终要求使用 TLS。它支持通过 TCP 端口 5671 的连接,在进入 AMQP 协议握手之前,TCP 连接首先用 TLS 覆盖,并且还支持通过 TCP 端口 5672 的连接,服务器立即使用 AMQP 规定的模型强制升级到 TLS 的连接。AMQP WebSockets 绑定通过 TCP 端口 443 创建一条隧道,该隧道相当于 AMQP 5671 连接。

其他帖子中有更多详细信息:

它支持通过 TCP 端口 5671 和 TCP 端口 5672 的连接。服务器立即使用 AMQP 规定的模型提供对 TLS 的强制升级。AMQP WebSockets 绑定通过 TCP 端口 443 创建一条隧道,该隧道相当于 AMQP 5671 连接。

我不太明白这两个端口有什么区别。两者都应该始终打开,还是只是所需的其中之一,另一个是一些后备,或者取决于所使用的库。

PS我使用Microsoft.Azure.ServiceBus库来连接

port firewall amqp azureservicebus

1
推荐指数
1
解决办法
2万
查看次数

不能将不可为 null 的对象作为接受 nullalble 的参数传递

我有这个简单的代码,它会生成一个警告:

private void MyMethod()
{
    IDictionary<string, object> notNullable = new Dictionary<string, object>();
    Test(notNullable);
}

private void Test(IDictionary<string, object?> nullable)
{
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时收到此警告(尽管它确实适用于!):

由于引用类型的可为空性的差异,“Dictionary<string, object>”类型的参数不能用于“...”中“IDictionary”类型的参数“nullable”

现在我可以看到相反的问题,但是我将不可为空的参数发送到可空参数是怎么回事?只是 C# 编译器的限制,或者可能是一个错误?

c# nullable-reference-types

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

C# 不接受“params object?[]values”参数为 null

我有一个这样定义的参数:params object?[] values并且我不能发送 null (即我想要一个内部有一个 null 的数组)。

它确实可以在没有参数的情况下工作。

错误是:Cannot convert null literal to non-nullable reference type.

public class Foo
{
    private void DoesNotWork(params object?[] values)
    {
    }
    
    private void DoesWork1(object? value)
    {
    }
    
    private void DoesWork2(object?[] values)
    {
    }

    public void Test()
    {
        DoesNotWork(null);
        DoesWork1(null);
        DoesWork2(new object?[] { null });
    }
}
Run Code Online (Sandbox Code Playgroud)

我是否做错了什么,或者编译器是否存在某些限制不允许这样做?

PS 如果方法“DoesNotWork”来自未打开 nullable 的库,它也可以工作,即它的定义如下:DoesNotWork(params object[] values),所以我可以在那里发送 null 。

PPS 我发现这个解决方法也有效: DoesNotWork((object?) null);

PPPSDoesNotWork(null!);也能发挥作用

.net c# parameters nullable nullable-reference-types

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