我有这个代码:
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?是。
我在这里遗漏了什么还是编译器有问题?
在 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
我最近发现,我们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
我有一个前段时间写的客户端,它使用旧库并GetBody<string>()在接收消息时调用读取正文。
现在我有了新客户端Microsoft.Azure.ServiceBus(发送消息),据我所知它总是使用Stream.
所以旧客户端只是因为它期望字符串主体类型而崩溃。我发现了很多关于相反场景(新读者,旧作者)的信息,但无法弄清楚如何让新客户端以所需格式发送数据。
相关链接:
我有以下代码:
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 可以是可为空的引用类型?我猜它默认为不可为空。
我有以下课程:
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支持的功能还是可以随时更改的巧合?如果是,那么我猜这个行为对于任何两个或更多接口是相同的,不一定是开放通用的?
我有一个简单的方法是这样的:
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 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# 编译的:
public void Foo<T>(T obj)
where T : class?
{
}
Run Code Online (Sandbox Code Playgroud)
我没有设法在文档中找到它甚至意味着什么。
PS 显然有人决定结束一个问题,甚至没有弄清楚“重复”并没有真正联系起来。首先尝试解决问题而不是结束问题有那么难吗?副本是关于可为空的原始类型,而可为空的引用类型则完全不同。除了有人看到他们都有一个问号并将问题标记为重复。
我正在尝试为一个身份分配一个角色来读取/写入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,但这个角色在任何地方都看不到。
我该如何分配这个角色?
我找到了有关 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库来连接
我有这个简单的代码,它会生成一个警告:
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# 编译器的限制,或者可能是一个错误?
我有一个这样定义的参数: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!);也能发挥作用
c# ×8
.net ×3
azure ×3
generics ×3
ajax ×1
amqp ×1
asp.net-core ×1
azure-cli ×1
c#-8.0 ×1
enumerable ×1
firewall ×1
jwt ×1
logging ×1
nullable ×1
parameters ×1
port ×1
servicebus ×1
web-config ×1