我最近了解了自定义可等待类型的可能性,正如这个问题和Stephen Toub所说,要成为可等待类型有几个要求。
所以如果一个类型T想要等待它必须
GetAwaiter返回有效等待者的无参数方法如果一个类型A想成为一个有效的等待者,它必须
INotifyCompletion接口IsCompletedGetResult方法,返回void或TResult所以现在我要问的是,如果所有这些都需要成为可等待类型,为什么某些接口的那部分不是像
public interface INotifyCompletion
{
bool IsCompleted { get; }
void OnCompleted(Action continuation);
}
public interface IAwaiter : INotifyCompletion
{
void GetResult();
}
public interface IAwaitable<TAwaiter> where TAwaiter : IAwaiter
{
TAwaiter GetAwaiter();
}
public interface IAwaiter<TResult> : INotifyCompletion
{
TResult GetResult();
}
// this would probably not necessary but …Run Code Online (Sandbox Code Playgroud) 我今天遇到了一个随机发生的问题,即我的所有 DevOps Pipelines 无法再访问我的 NuGet feed,这是一个 DevOps Artifact。
我有一个任务负责安装 AzureSignTool,下面是该任务的 YAML。windows-latest我正在Microsoft 托管代理上使用该图像。
- task: CmdLine@2
displayName: 'Install AzureSignTool'
inputs:
script: |
set DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true
dotnet tool install --global AzureSignTool --version 4.0.1
Run Code Online (Sandbox Code Playgroud)
这是因以下错误而失败的任务。
未处理的异常:NuGet.Protocol.Core.Types.FatalProtocolException:无法加载 source 的服务索引。---> System.Net.Http.HttpRequestException:响应状态代码不表示成功:401(未经授权)。
我已经检查了提要的权限,并且可以确认它们Project\Build Administrators已设置为所有者。
我还尝试了各种其他操作,包括更改代理上的 NuGet 版本、更改 AzureSignTool 的版本等。
我应该检查哪些权限/设置?
因此,我将 RestoreNuGetPackages 任务移到 InstallAzureSignTool 之前,并且该任务成功,因此显然它可以毫无问题地进行身份验证。
然而任务仍然失败。我什至添加了--ignore-failed-sources但这没有效果。
错误消息已更改,但根本问题是相同的。
[NuGet Manager] [Info] GET https://api.nuget.org/v3/registration5-gz-semver2/azuresigntool/index.json
[NuGet Manager] [Info] GET https://{ORG}.pkgs.visualstudio.com/_packaging/{GUID}/nuget/v3/registrations2-semver2/azuresigntool/index.json
[NuGet Manager] [Info] Unauthorized https://{ORG}.pkgs.visualstudio.com/_packaging/{GUID}/nuget/v3/registrations2-semver2/azuresigntool/index.json 767ms
[NuGet Manager] [Info] OK https://api.nuget.org/v3/registration5-gz-semver2/azuresigntool/index.json 1010ms
Unhandled …Run Code Online (Sandbox Code Playgroud) 我有一个 Web API 项目,其中有许多使用 API 密钥进行保护的端点。为了实现这一点,我编写了一些中间件来处理检查 API 密钥标头并验证它。该中间件在 Startup.cs 中配置
app.UseMiddleware<ApiKeyMiddleware>();
Run Code Online (Sandbox Code Playgroud)
这非常有效,但是我现在需要一个不需要任何授权的端点,以便可以在浏览器中查看它。我希望这可以通过使用AllowAnonymous属性来完成,但是中间件仍然检查 API 密钥。
我可以通过删除中间件并将 API 密钥检查到属性中来实现我想要的目的,但是有更好的方法吗?
编辑:
这是 API 密钥中间件实现。
public class ApiKeyMiddleware
{
private readonly RequestDelegate _next;
private const string API_KEY_HEADER = "z-api-key";
public ApiKeyMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
if (!context.Request.Headers.TryGetValue(API_KEY_HEADER, out var extractedApiKey))
{
context.Response.StatusCode = 401;
await context.Response.WriteAsync($"Api Key was not found in request. Please pass key in {API_KEY_HEADEr} header.");
return;
}
var appSettings = context.RequestServices.GetRequiredService<IConfiguration>(); …Run Code Online (Sandbox Code Playgroud) 我有一个值列表,这些都是字母和数字的组合,用于制作ID,但在某些情况下,这可能只是一个0.
我需要删除这是0的所有场合.
我尝试过类似的东西
For i = 0 the list.count - 1
If list(i) = "0" Then
list.RemoveAt(j)
End If
Next
Run Code Online (Sandbox Code Playgroud)
但是这会在最后抛出一个超出范围异常的参数,因为循环继续,我不能使用Exit For,因为我需要检查多个零.
我不太擅长看起来像我想做的那样的Lamda表达,并且不理解它们,所以如果有人可以给出并解释一个可行的,那就太棒了.