我想使用 Refit 来查询 API。首先,我需要获取一个访问令牌,它是一个返回状态 400 的 POST 请求。我不知道是什么原因导致了问题,因此我想查看发送到 API 的实际原始请求。不幸的是,我还没有设法让它发挥作用,而且很可能在开发过程中我会更频繁地需要它。
我发现了这个漂亮的记录器program.cs,并认为我可以在我的DelegatingHandler中使用它,如下所示:
builder.Services.AddRefitClient<IVismaConnect>().ConfigureHttpClient(config =>
{
config.BaseAddress = new Uri("https://ENDPOINT");
config.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "SOMECREDENTIALSTHATEVENTUALLYWILLBEREADFROMACONFIGFILE");
config.DefaultRequestHeaders.TryAddWithoutValidation("content-type", "application/x-www-form-urlencoded");
}).AddHttpMessageHandler<HttpLoggingHandler>();
Run Code Online (Sandbox Code Playgroud)
现在我收到一条奇特的错误消息,告诉我“没有注册 ...HttpLoggingHandler 类型的服务”:
所以我用谷歌搜索了一下,发现一个提示,我需要将 HttpLoggingHandler 注册为单例,因此我将此行放在 program.cs 中代码的正上方(也在下面尝试过,没有任何区别):
builder.Services.AddTransient<HttpLoggingHandler>();
Run Code Online (Sandbox Code Playgroud)
现在我收到另一个异常,说“‘InnerHandler’属性必须为 null。提供给‘HttpMessageHandlerBuilder’的‘DelegatingHandler’实例不得重用或缓存”:
经过更多谷歌搜索后,我发现了一些有关 Microsoft 的 ASP.NET core 中的 HTTP 日志记录的文档。
这并没有改变任何东西,异常仍然弹出,所以我只尝试了 MS 的建议,没有使用我之前尝试过的 HttpLoggingHandler,但这并没有生成任何输出。
任何有关如何正确记录 Refit 发送到服务器的原始请求的建议将不胜感激。请参阅下面的完整program.cs文件:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpLogging(logging =>
{
logging.LoggingFields = HttpLoggingFields.All;
});
// Add services to the container.
builder.Services.AddTransient<HttpLoggingHandler>();
builder.Services.AddRefitClient<IVismaConnect>().ConfigureHttpClient(config =>
{ …Run Code Online (Sandbox Code Playgroud) Microsoft 产品由于其极其糟糕的文档而给我带来了困难,PowerShell 也不例外。到目前为止,我一直在使用不同版本的 PowerShell,但我离理解不同版本还很远,尤其是在 Azure 方面。
据我所知,PowerShell 5 已停产,PowerShell ISE 也是如此。按照 Microsoft 的建议,我切换到最新版本 7 和 Visual Studio Code。我不得不承认,他们合作得很好。(我仍然想知道为什么没有对在 Visual Studio 中开发 PowerShell 的本机支持。)
对于 Azure,有 Azure、AzureRM、msol 和 Az 模块。后者显然是取代 Azure 和 AzureRM 的最新版本。正如我们所知,它们不能一起工作,不能向上/向下兼容,同时它们不提供相同的功能。
现在我想使用 PowerShell 将域添加到 Azure Active Directory。我发现的唯一 cmdlet 是New-AzureAdDomain - 它在 PowerShell 7 中不起作用。 经过一些研究,我发现这篇文章告诉我我不能使用 PowerShell 7,而应该使用 PowerShell 6:
对于 Azure Active Directory PowerShell for Graph 模块,必须使用 PowerShell 5.1 或更高版本。对于 Windows PowerShell 模块的 Microsoft Azure Active Directory 模块,您必须使用 PowerShell 版本 5.1 或更高版本,直到 PowerShell 版本 6。 …
使用 .NET/C# 应用程序,我尝试从 HTTP API 下载数据。即使 HttpClient 实例的超时设置为 30 分钟,请求的超时速度也会更快。今天我了解到这是因为 .NET HttpClient 不发送任何 TCP Keep Alive 数据包。(这就是为什么我可以从 Chrome 中的 API 下载数据,正如 Wireshark 所证明的那样,Chrome 确实发送这些数据包,而 HttpClient 则不发送。)
这就是我希望从 API 获取 JSON 数据的方式:
this.httpclient = new HttpClient();
[...]
result = await this.httpclient.GetAsync(url);
Run Code Online (Sandbox Code Playgroud)
现在我做了一些研究,但我不知道如何发送这些保持活动 ping。HttpClient 似乎不支持它们。所以我的猜测是打开连接时需要在套接字上启用这些。有没有解决这个问题的方法,也许可以避免 HttpClient?我可以在套接字上启用 Keep-Alive ping 吗?这是需要通过操作系统启用的功能吗?
请注意:这不是与 HTTP“Connection: Keep-Alive”标头您可以为 HttpClient 类启用此功能,但由于显而易见的原因,它不会触发任何 TCP Keep Alive 数据包。
编辑:
当客户端发送这些 Keep-Alive 数据包时,请求始终有效,否则它们将失败。这可以通过使用不同的客户端/浏览器来重现。最好的例子:Postman Chrome 扩展确实会发送 Keep-Alive 数据包,因此请求有效。使用几乎相同的 Postman 独立客户端,请求会失败(或不返回任何数据),因为有趣的是,独立客户端不会发送任何可以使用 Wireshark 轻松检查的 Keep-Alive 数据包。
编辑:我找到了解决这个问题的一个非常简单的解决方案,请参阅下面的答案。
我正在开发一个访问速率受限的 API 的集成解决方案。我正在不同端点上(尽管在同一服务器上)使用多个 HTTP 动词对 API 执行各种 CRUD 操作。我多次被指向 Polly,但我还没有想出一个真正有效的解决方案。
这就是我在初创公司中所拥有的:
builder.Services
.AddHttpClient("APIClient", client =>
{
client.BaseAddress = new Uri(C.Configuration.GetValue<string>("APIBaseAddress"));
})
.AddTransientHttpErrorPolicy(builder =>
builder.WaitAndRetryAsync(new []
{
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(5),
TimeSpan.FromSeconds(15),
}));
Run Code Online (Sandbox Code Playgroud)
这只是在失败时重试的弹性。我在单例 ApiWrapper 类中有一个 RateLimit 策略:
public sealed class ApiWrapper
{
private static readonly Lazy<ApiWrapper> lazy = new Lazy<ApiWrapper>(() => new ApiWrapper());
public static ApiWrapper Instance { get { return lazy.Value; } }
private IHttpClientFactory _httpClientFactory;
public readonly AsyncRateLimitPolicy RateLimit = Policy.RateLimitAsync(150, TimeSpan.FromSeconds(10), 50); // 150 actions within 10 sec, 50 …Run Code Online (Sandbox Code Playgroud) c# ×3
httpclient ×2
.net ×1
asp.net-core ×1
azure ×1
polly ×1
powershell ×1
refit ×1
resiliency ×1
tcp ×1