ASP.NET Core基础知识(十四)【发出 HTTP 请求】

.NET Core 中如何构建一个弹性HTTP 请求机制 弹性是指系统在面对故障或异常情况时,能够保持或快速恢复到正常状态的能力。在 HTTP 请求的上下文中,弹性意味着当请求失败时,系统能够自动采取一系列措施(如重试、降级、断路等)来确保请求最终成功或优雅地处理失败。瞬态故障是指那些暂时性的、通常会自动恢复的故障。例如,网络抖动、服务暂时不可用等。瞬态故障的特点是它们通常是短暂的,重试后可能会成功。 阅读详情

可以注册 IHttpClientFactory并将其用于配置和创建应用中的 HttpClient实例。 这能带来以下好处:

  • 提供一个中心位置,用于命名和配置逻辑 HttpClient 实例。 例如,可以注册 github 客户端,并将它配置为访问 GitHub。 可以注册一个默认客户端用于其他用途。
  • 通过委托 HttpClient 中的处理程序整理出站中间件的概念,并提供适用于基于 Polly 的中间件的扩展来利用概念。
  • 管理基础 HttpClientMessageHandler 实例的池和生存期,避免在手动管理 HttpClient 生存期时出现常见的 DNS 问题。
  • (通过 ILogger)添加可配置的记录体验,以处理工厂创建的客户端发送的所有请求。

系统必备

面向.NET Framework 的项目要求安装 Microsoft.Extensions.Http NuGet 包。 面向 .NET Core 且引用 Microsoft.AspNetCore.App 元包的项目已经包括 Microsoft.Extensions.Http 包。

消耗模式

在应用中可以通过以下多种方式使用 IHttpClientFactory:

  • 基本用法
  • 命名客户端
  • 类型化客户端
  • 生成的客户端

它们之间不存在严格的优先级。 最佳方法取决于应用的约束条件。

基本用法

在 Startup.ConfigureServices 方法中,通过在 IServiceCollection 上调用 AddHttpClient 扩展方法可以注册 IHttpClientFactory。

services.AddHttpClient();

注册后,在可以使用依赖关系注入 (DI) 注入服务的任何位置,代码都能接受 IHttpClientFactory。 IHttpClientFactory 可以用于创建 HttpClient 实例:

public class BasicUsageModel : PageModel
{
    private readonly IHttpClientFactory _clientFactory;

    public IEnumerable<GitHubBranch> Branches { get; private set; }

    public bool GetBranchesError { get; private set; }

    public BasicUsageModel(IHttpClientFactory clientFactory)
    {
        _clientFactory = clientFactory;
    }

    public async Task OnGet()
    {
        var request = new HttpRequestMessage(HttpMethod.Get, 
            "https://api.github.com/repos/aspnet/docs/branches");
        request.Headers.Add("Accept", "application/vnd.github.v3+json");
        request.Headers.Add("User-Agent", "HttpClientFactory-Sample");

        var client = _clientFactory.CreateClient();

        var response = await client.SendAsync(request);

        if (response.IsSuccessStatusCode)
        {
            Branches = await response.Content
                .ReadAsAsync<IEnumerable<GitHubBranch>>();
        }
        else
        {
            GetBranchesError = true;
            Branches = Array.Empty<GitHubBranch>();
        }                               
    }
}

以这种方式使用 IHttpClientFactory 适合重构现有应用。 这不会影响 HttpClient 的使用方式。 在当前创建 HttpClient 实例的位置,使用对 CreateClient 的调用替换这些匹配项。

命名客户端

如果应用需要有许多不同的 HttpClient 用法(每种用法的配置都不同),可以视情况使用命名客户端。 可以在 HttpClient 中注册时指定命名 Startup.ConfigureServices 的配置。

services.AddHttpClient("github", c =>
{
    c.BaseAddress = new Uri("https://api.github.com/");
    // Github API versioning
    c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
    // Github requires a user-agent
    c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});

上面的代码调用 AddHttpClient,同时提供名称“github”。 此客户端应用了一些默认配置,也就是需要基址和两个标头来使用 GitHub API。

每次调用 CreateClient 时,都会创建 HttpClient 的新实例,并调用配置操作。

要使用命名客户端,可将字符串参数传递到 CreateClient。 指定要创建的客户端的名称:

public class NamedClientModel : PageModel
{
    private readonly IHttpClientFactory _clientFactory;

    public IEnumerable<GitHubPullRequest> PullRequests { get; private set; }

    public bool GetPullRequestsError { get; private set; }

    public bool HasPullRequests => PullRequests.Any();

    public NamedClientModel(IHttpClientFactory clientFactory)
    {
        _clientFactory = clientFactory;
    }

    public async Task OnGet()
    {
        var request = new HttpRequestMessage(HttpMethod.Get, 
            "repos/aspnet/docs/pulls");

        var client = _clientFactory.CreateClient("github");

        var response = await client.SendAsync(request);

        if (response.IsSuccessStatusCode)
        {
            PullRequests = await response.Content
                .ReadAsAsync<IEnumerable<GitHubPullRequest>>();
        }
        else
        {
            GetPullRequestsError = true;
            PullRequests = Array.Empty<GitHubPullRequest>();
        }
    }
}

在上述代码中,请求不需要指定主机名。 可以仅传递路径,因为采用了为客户端配置的基址。

类型化客户端

类型化客户端提供与命名客户端一样的功能,不需要将字符串用作密钥。 类型化客户端方法在使用客户端时提供 IntelliSense 和编译器帮助。 它们提供单个地址来配置特定 HttpClient 并与其进行交互。 例如,单个类型化客户端可能用于单个后端终结点,并封装此终结点的所有处理逻辑。 另一个优势是它们使用 DI 且可以被注入到应用中需要的位置。

类型化客户端在构造函数中接收 HttpClient 参数:

public class GitHubService
{
    public HttpClient Client { get; }

    public GitHubService(HttpClient client)
    {
        client.BaseAddress = new Uri("https://api.github.com/");
        // GitHub API versioning
        client.DefaultRequestHeaders.Add("Accept", 
            "application/vnd.github.v3+json");
        // GitHub requires a user-agent
        client.DefaultRequestHeaders.Add("User-Agent", 
            "HttpClientFactory-Sample");

        Client = client;
    }

    public async Task<IEnumerable<GitHubIssue>> GetAspNetDocsIssues()
    {
        var response = await Client.GetAsync(
            "/repos/aspnet/docs/issues?state=open&sort=created&direction=desc");

        response.EnsureSuccessStatusCode();

        var result = await response.Content
            .ReadAsAsync<IEnumerable<GitHubIssue>>();

        return result;
    }
}

在上述代码中,配置转移到了类型化客户端中。 HttpClient 对象公开为公共属性。 可以定义公开 HttpClient 功能的特定于 API 的方法。 GetAspNetDocsIssues 方法从 GitHub 存储库封装查询和分析最新待解决问题所需的代码。

要注册类型化客户端,可在 Startup.ConfigureServices 中使用通用的 xref:Microsoft.Extensions.DependencyInjection.HttpClientFactoryServiceCollectionExtensions.AddHttpClient* 扩展方法,指定类型化客户端类:

services.AddHttpClient<GitHubService>();

使用 DI 将类型客户端注册为暂时客户端。 可以直接插入或使用类型化客户端:

public class TypedClientModel : PageModel
{
    private readonly GitHubService _gitHubService;

    public IEnumerable<GitHubIssue> LatestIssues { get; private set; }

    public bool HasIssue => LatestIssues.Any();

    public bool GetIssuesError { get; private set; }

    public TypedClientModel(GitHubService gitHubService)
    {
        _gitHubService = gitHubService;
    }

    public async Task OnGet()
    {
        try
        {
            LatestIssues = await _gitHubService.GetAspNetDocsIssues();
        }
        catch(HttpRequestException)
        {
            GetIssuesError = true;
            LatestIssues = Array.Empty<GitHubIssue>();
        }            
    }
}

根据你的喜好,可以在 Startup.ConfigureServices 中注册时指定类型化客户端的配置,而不是在类型化客户端的构造函数中指定:

services.AddHttpClient<RepoService>(c =>
{
    c.BaseAddress = new Uri("https://api.github.com/");
    c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
    c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});

可以将 HttpClient 完全封装在类型化客户端中。 不是将它公开为属性,而是可以提供公共方法,用于在内部调用 HttpClient。

public class RepoService
{
    // _httpClient isn't exposed publicly
    private readonly HttpClient _httpClient;

    public RepoService(HttpClient client)
    {
        _httpClient = client;
    }

    public async Task<IEnumerable<string>> GetRepos()
    {
        var response = await _httpClient.GetAsync("aspnet/repos");

        response.EnsureSuccessStatusCode();

        var result = await response.Content
            .ReadAsAsync<IEnumerable<string>>();

        return result;
    }
}

在上述代码中,HttpClient 存储未私有字段。 进行外部调用的所有访问都经由 GetRepos 方法。

生成的客户端

IHttpClientFactory 可结合其他第三方库(例如 Refit)使用。 Refit 是.NET 的 REST 库。 它将 REST API 转换为实时接口。 RestService 动态生成该接口的实现,使用 HttpClient 进行外部 HTTP 调用。

定义了接口和答复来代表外部 API 及其响应:

public interface IHelloClient
{
    [Get("/helloworld")]
    Task<Reply> GetMessageAsync();
}

public class Reply
{
    public string Message { get; set; }
}

可以添加类型化客户端,使用 Refit 生成实现:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient("hello", c =>
    {
        c.BaseAddress = new Uri("http://localhost:5000");
    })
    .AddTypedClient(c => Refit.RestService.For<IHelloClient>(c));

    services.AddMvc();
}

可以在必要时使用定义的接口,以及由 DI 和 Refit 提供的实现:

[ApiController]
public class ValuesController : ControllerBase
{
    private readonly IHelloClient _client;

    public ValuesController(IHelloClient client)
    {
        _client = client;
    }

    [HttpGet("/")]
    public async Task<ActionResult<Reply>> Index()
    {
        return await _client.GetMessageAsync();
    }
}

出站请求中间件

HttpClient 已经具有委托处理程序的概念,这些委托处理程序可以链接在一起,处理出站 HTTP 请求。 IHttpClientFactory 可以轻松定义处理程序并应用于每个命名客户端。 它支持注册和链接多个处理程序,以生成出站请求中间件管道。 每个处理程序都可以在出站请求前后执行工作。 此模式类似于 ASP.NET Core 中的入站中间件管道。 此模式提供了一种用于管理围绕 HTTP 请求的横切关注点的机制,包括缓存、错误处理、序列化以及日志记录。

要创建处理程序,请定义一个派生自 DelegatingHandler的类。 重写 SendAsync 方法,在将请求传递至管道中的下一个处理程序之前执行代码:

public class ValidateHeaderHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request,
        CancellationToken cancellationToken)
    {
        if (!request.Headers.Contains("X-API-KEY"))
        {
            return new HttpResponseMessage(HttpStatusCode.BadRequest)
            {
                Content = new StringContent(
                    "You must supply an API key header called X-API-KEY")
            };
        }

        return await base.SendAsync(request, cancellationToken);
    }
}

上述代码定义了基本处理程序。 它检查请求中是否包含 X-API-KEY 头。 如果标头缺失,它可以避免 HTTP 调用,并返回合适的响应。

在注册期间可将一个或多个标头添加到 HttpClient 的配置。 此任务通过 IHttpClientBuilder上的扩展方法完成。

services.AddTransient<ValidateHeaderHandler>();

services.AddHttpClient("externalservice", c =>
{
    // Assume this is an "external" service which requires an API KEY
    c.BaseAddress = new Uri("https://localhost:5000/");
})
.AddHttpMessageHandler<ValidateHeaderHandler>();

在上述代码中通过 DI 注册了 ValidateHeaderHandler。 IHttpClientFactory 为每个处理程序创建单独的 DI 作用域。 处理程序可依赖于任何作用域的服务。 处理程序依赖的服务会在处置处理程序时得到处置。

注册后可以调用 AddHttpMessageHandler,传入标头的类型。

可以按处理程序应该执行的顺序注册多个处理程序。 每个处理程序都会覆盖下一个处理程序,直到最终 HttpClientHandler 执行请求:

services.AddTransient<SecureRequestHandler>();
services.AddTransient<RequestDataHandler>();

services.AddHttpClient("clientwithhandlers")
    // This handler is on the outside and called first during the 
    // request, last during the response.
    .AddHttpMessageHandler<SecureRequestHandler>()
    // This handler is on the inside, closest to the request being 
    // sent.
    .AddHttpMessageHandler<RequestDataHandler>();

使用以下方法之一将每个请求状态与消息处理程序共享:

  • 使用 HttpRequestMessage.Properties 将数据传递到处理程序。
  • 使用 IHttpContextAccessor 访问当前请求。
  • 创建自定义 AsyncLocal 存储对象以传递数据。

使用基于 Polly 的处理程序

IHttpClientFactory 与一个名为 Polly 的热门第三方库集成。 Polly 是适用于 .NET 的全面恢复和临时故障处理库。 开发人员通过它可以表达策略,例如以流畅且线程安全的方式处理重试、断路器、超时、Bulkhead 隔离和回退。

提供了扩展方法,以实现将 Polly 策略用于配置的 HttpClient 实例。 Microsoft.Extensions.Http.Polly NuGet 包中提供 Polly 扩展。 Microsoft.AspNetCore.App 元包中不包括此包。 若要使用扩展,项目中应该包括显式 <PackageReference />。

<Project Sdk="Microsoft.NET.Sdk.Web">
  
  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>
  
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.Extensions.Http.Polly" Version="2.1.1" />
  </ItemGroup>
  
</Project>

还原此包后,可以使用扩展方法来支持将基于 Polly 的处理程序添加至客户端。

处理临时故障

大多数常见错误在暂时执行外部 HTTP 调用时发生。 包含了一种简便的扩展方法,该方法名为 AddTransientHttpErrorPolicy,允许定义策略来处理临时故障。 使用这种扩展方法配置的策略可以处理 HttpRequestException、HTTP 5xx 响应以及 HTTP 408 响应。

AddTransientHttpErrorPolicy 扩展可在 Startup.ConfigureServices 内使用。 该扩展可以提供 PolicyBuilder 对象的访问权限,该对象配置为处理表示可能的临时故障的错误:

services.AddHttpClient<UnreliableEndpointCallerService>()
    .AddTransientHttpErrorPolicy(p => 
        p.WaitAndRetryAsync(3, _ => TimeSpan.FromMilliseconds(600)));

上述代码中定义了 WaitAndRetryAsync 策略。 请求失败后最多可以重试三次,每次尝试间隔 600 ms。

动态选择策略

存在其他扩展方法,可以用于添加基于 Polly 的处理程序。 这类扩展的其中一个是 AddPolicyHandler,它具备多个重载。 一个重载允许在定义要应用的策略时检查该请求:

var timeout = Policy.TimeoutAsync<HttpResponseMessage>(
    TimeSpan.FromSeconds(10));
var longTimeout = Policy.TimeoutAsync<HttpResponseMessage>(
    TimeSpan.FromSeconds(30));

services.AddHttpClient("conditionalpolicy")
// Run some code to select a policy based on the request
    .AddPolicyHandler(request => 
        request.Method == HttpMethod.Get ? timeout : longTimeout);

在上述代码中,如果出站请求为 GET,则应用 10 秒超时。 其他所有 HTTP 方法应用 30 秒超时。

添加多个 Polly 处理程序

嵌套 Polly 策略以增强功能是很常见的:

services.AddHttpClient("multiplepolicies")
    .AddTransientHttpErrorPolicy(p => p.RetryAsync(3))
    .AddTransientHttpErrorPolicy(
        p => p.CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)));

在上述示例中,添加两个处理程序。 第一个使用 AddTransientHttpErrorPolicy 扩展添加重试策略。 若请求失败,最多可重试三次。 第二个调用 AddTransientHttpErrorPolicy 添加断路器策略。 如果尝试连续失败了五次,则会阻止后续外部请求 30 秒。 断路器策略处于监控状态。 通过此客户端进行的所有调用都共享同样的线路状态。

从 Polly 注册表添加策略

管理常用策略的一种方法是一次性定义它们并使用 PolicyRegistry 注册它们。 提供了一种扩展方法,可以使用注册表中的策略添加处理程序:

var registry = services.AddPolicyRegistry();

registry.Add("regular", timeout);
registry.Add("long", longTimeout);

services.AddHttpClient("regulartimeouthandler")
    .AddPolicyHandlerFromRegistry("regular");

在上面的代码中,两个策略在 PolicyRegistry 添加到 ServiceCollection 中时进行注册。 若要使用注册表中的策略,请使用 AddPolicyHandlerFromRegistry 方法,同时传递要应用的策略的名称。

要进一步了解 IHttpClientFactory 和 Polly 集成,请参考 Polly Wiki。

HttpClient 和生存期管理

每次对 IHttpClientFactory 调用 CreateClient 都会返回一个新 HttpClient 实例。 每个命名的客户端都具有一个 HttpMessageHandler。 工厂管理 HttpMessageHandler 实例的生存期。

IHttpClientFactory 将工厂创建的 HttpMessageHandler 实例汇集到池中,以减少资源消耗。 新建 HttpClient 实例时,可能会重用池中的 HttpMessageHandler 实例(如果生存期尚未到期的话)。

由于每个处理程序通常管理自己的基础 HTTP 连接,因此需要池化处理程序。 创建超出必要数量的处理程序可能会导致连接延迟。 部分处理程序还保持连接无期限地打开,这样可以防止处理程序对 DNS 更改作出反应。

处理程序的默认生存期为两分钟。 可在每个命名客户端上重写默认值。 要重写该值,请在创建客户端时在返回的 IHttpClientBuilder 上调用 SetHandlerLifetime:

services.AddHttpClient("extendedhandlerlifetime")
    .SetHandlerLifetime(TimeSpan.FromMinutes(5));

无需处置客户端。 处置既取消传出请求,又保证在调用 Dispose后无法使用给定的 HttpClient 实例。 IHttpClientFactory 跟踪和处置 HttpClient 实例使用的资源。 HttpClient 实例通常可视为无需处置的 .NET 对象。

保持各个 HttpClient 实例长时间处于活动状态是在 IHttpClientFactory 推出前使用的常见模式。 迁移到 IHttpClientFactory 后,就无需再使用此模式。

日志记录

通过 IHttpClientFactory 创建的客户端记录所有请求的日志消息。 在日志记录配置中启用合适的信息级别可以查看默认日志消息。 仅在跟踪级别包含附加日志记录(例如请求标头的日志记录)。

用于每个客户端的日志类别包含客户端名称。 例如,名为“MyNamedClient”的客户端使用 System.Net.Http.HttpClient.MyNamedClient.LogicalHandler 类别来记录消息。 后缀为 LogicalHandler 的消息在请求处理程序管道外部发生。 在请求时,在管道中的任何其他处理程序处理请求之前记录消息。 在响应时,在任何其他管道处理程序接收响应之后记录消息。

日志记录还在请求处理程序管道内部发生。 在“MyNamedClient”示例中,这些消息是针对日志类别 System.Net.Http.HttpClient.MyNamedClient.ClientHandler 进行记录。 在请求时,在所有其他处理程序运行后,以及刚好在通过网络发出请求之前记录消息。 在响应时,此日志记录包含响应在通过处理程序管道被传递回去之前的状态。

在管道内外启用日志记录,可以检查其他管道处理程序做出的更改。 例如,其中可能包含对请求标头的更改,或者对响应状态代码的更改。

通过在日志类别中包含客户端名称,可以在必要时对特定的命名客户端筛选日志。

配置 HttpMessageHandler

控制客户端使用的内部 HttpMessageHandler 的配置是有必要的。

在添加命名客户端或类型化客户端时,会返回 IHttpClientBuilder。 ConfigurePrimaryHttpMessageHandler扩展方法可以用于定义委托。 委托用于创建和配置客户端使用的主要 HttpMessageHandler:

services.AddHttpClient("configured-inner-handler")
    .ConfigurePrimaryHttpMessageHandler(() =>
    {
        return new HttpClientHandler()
        {
            AllowAutoRedirect = false,
            UseDefaultCredentials = true
        };
    });
Oracle ERP EBS R12 GL总帐业务方案 系统操作 本文档是Oracle ERP系统的总账管理模块使用手册,主要包含以下内容:1.系统架构设计,详细介绍多组织架构、会计科目设置等核心概念;2.总账日常操作流程,包括凭证录入、审核、过账等全流程管理;3.特殊业务处理,涵盖预算控制、内部往来、合并报表等专项功能;4.期末处理,说明月结、年结的操作步骤;5.系统设置指南,提供会计科目表、权限控制等配置说明;6.附录包含各业务模块的分录示例和系统操作图标说明。本手册适用于财务人员学习和使用Oracle ERP总账系统,重点讲解系统功能要点和实操步骤。 阅读详情

相关推荐

倾向得分匹配的stata命令_政策评估方法引荐|广义倾向得分匹配(GPSM)

和大家分享一下最近学习的进展,在痛苦读完stata journal和练习OA程序,已经可以基本完成广义倾向得分的估计了,在国内这一方法还没有形成广泛运用,因此学习资源也是有点稀缺的,在文章最后给各位提供数据和代码以供练习。有问题可以随时文末留言或者联系我哦。人文社会科学中一般无法在实验室中控制样本个体的特征,我们一般采用“准自然实验”的研究路径,也就是不随机安排样本接受处理与否。但放弃随机分组假定...

weixin_39550258的博客 1万+

理解ASP.NET Core - 发送Http请求(HttpClient)

🚀 优质资源分享 🚀 学习路线指引(点击解锁) 知识定位 人群定位 🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 注:本文隶属于《理解ASP.NET Core》系列文章,请查看置顶博客或点击此处查看全文目录 前言 在.NET中,我们有很多发送Http请求的手段,如HttpWeb

weixin_45566993的博客 4031

在 STM32CubeIDE 中针对 STM32F407 移植 ThreadX

在 STM32CubeIDE 中针对 STM32F407 移植 ThreadX,不依赖盗版破解的Keil MDK、IAR等软件。

wangyuewu08的博客 3374

.NET 开源项目 Polly 介绍

今天介绍一个 .NET 开源库:Polly,它是支持 .NET Core 的,目前在 GitHub 的 Star 数量已经接近 5 千,它是一个强大且实用的 .NET 库。 Polly 介绍 官方对 Polly 的介绍是这样的: Polly is a .NET resilience and transient-fault-handling library that allows developers to express policies such as Retry, Circuit Bre...

逆-血 1383

脑电数据预处理十四:主成分分析(PCA)用于伪迹去除与降维

本文探讨了主成分分析(PCA)在脑电图(EEG)预处理中的双重应用。针对EEG数据的高维特性和伪迹干扰问题,PCA既可有效去除高振幅伪迹(如眼动、心电等),又能实现数据降维。文章详细解析了PCA的核心原理,包括正交基向量投影和方差最大保留机制,并提供了基于MNE-Python的完整实现方案。通过代码示例展示了PCA在伪迹去除和降维中的具体应用效果,包括功率谱密度和时域波形的可视化对比。虽然ICA在复杂伪迹处理上更具优势,但PCA以其算法简单、计算高效的特点,成为EEG分析流程中不可或缺的基础工具。

qq_32516809的博客 1417

Redis 可视化工具 RedisInsight 的保姆级安装以及使用(最新)

Redis 可视化工具 RedisInsight 的保姆级安装以及使用(最新)

一名全栈小白的博客 1万+

.net core 中一次Http请求流程

NET Core 的 Web 服务器将从客户端接收请求,然后创建一个 HttpContext 对象,该对象包括表示 HTTP 请求和响应的所有信息。需要注意的是,在这个过程中,还有一些其他的操作可能会涉及到,如日志记录、错误处理、HTTP 上下文访问等。响应将回到应用程序中的中间件,中间件可以进行一些额外的逻辑,例如添加头信息、缓存响应等。当控制器中的操作完成其逻辑处理,并设置了要发送到客户端的内容时,响应将由应用程序发送回到客户端。一旦经过中间件的处理之后,请求将被路由到正确的控制器。

badboyzzz1的博客 877

数字孪生通信层开发:C#实现OPC UA到Unity3D的实时数据映射(2026年工业级实战指南)

(西门子数字孪生总监):“在产线上,50ms的延迟意味着1%的设备误操作率。2026年,通信层不是‘工具’,是数字孪生的‘生命线’。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 182

.NetCore Http请求代码

【代码】.NetCore Http请求代码。

分享DotNet技术和日常开发笔记,DotNet,Python为主。 797

提升YOLOv8性能:用Swin Transformer替换Backbone的详细实现与分析【YOLOv8】

YOLOv8作为目标检测领域的最新版本,在速度和精度之间取得了良好的平衡。然而,随着计算机视觉任务的复杂性不断增加,YOLOv8的标准主干网络(Backbone)在处理高分辨率图像或多尺度目标时,可能存在一定的局限性。为了进一步提升YOLOv8的性能,我们可以引入Swin Transformer替换其主干网络,以增强模型的全局感知能力和多尺度特征提取能力。本文将详细介绍如何在YOLOv8中用Swin Transformer替换原有的Backbone,提供代码示例,并深入探讨其中的原理和效果。

博客 1717

Machine Unlearning: A Survey

机器学习已经引起了广泛的关注,并发展成为一种使能技术,用于广泛的高度成功的应用,如智能计算机视觉、语音识别、医疗诊断等。然而,由于隐私、可用性和/或被遗忘权,一些特定样本的信息需要从称为机器遗忘的模型中删除,这就产生了一种特殊的需求。这项新兴技术因其创新性和实用性而引起了学术界和工业界的极大兴趣。与此同时,这个雄心勃勃的问题导致了许多旨在应对其挑战的研究工作。据我们所知,没有任何研究分析过这一复杂的主题,也没有比较过现有的遗忘解决方案在不同场景下的可行性。因此,通过这项调查,我们旨在了解遗忘技术的关键概念。

c_cpp_csharp的专栏 1159

使用 ASP.NET Core HttpLoggingMiddleware 记录 http 请求/响应

他们向我们保证,他们的产品不会以任何方式干扰我们的应用程序。为了“证明”这一点,我构建了一个中间件,用于存储我们收到和发送的所有唯一标头。然后我创建了一个转储所有标头的端点。如您所见,我们现在正在记录请求和响应主体。通过盲目地记录请求/响应标头/主体,您可以(很可能)记录敏感数据。因此,通过转到 /show-headers,您将看到我们的应用程序接收和发送的所有(唯一)标头的转储。记录请求/响应主体时,我们每秒会额外损失约 100 个请求。考虑记录请求/响应主体时应用程序的性能会受到怎样的影响也很重要。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 10万+

uboot引导vxworks--t2080调试记录

开发环境: t2080rdb, uboot2015, vxworks7.01. 《VxWorks_7_fsl_t2t4_BSP_Supplement_Guide__SR0620.pdf》描述: 实际上默认创建的vip,profile选项为none时,vip内核配置中是包含了INCLUDE_END选项的。所以在创建vip的时候最好就添加上PROFILE_DEVELOPMENT。 2. 内核参数bootargs是一些网络参数设置=> pri bootargs bootargs=memac(1,0)b109304

珂珂可爱多 2640

ASP.NET Core 中使用IHttpClientFactory发出HTTP请求

1.HttpClient类使用存在的问题HttpClient类的使用所存在的问题,百度搜索的文章一大堆,好多都是单纯文字描述,让人感觉不太好理解,为了更好理解HttpCl...

dotNET跨平台 2205

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Asp.Net VS ASP.NET Core 请求管道

**1 Asp.Net Web Form管道 请求进入Asp.Net工作进程后,由进程创建HttpWorkRequest对象,封装此次请求有关的所有信息,然后进入HttpRuntime类进行进一步处理。HttpRuntime通过请求信息创建HttpContext上下文对象,此对象将贯穿整个管道,直到响应结束。同时创建或从应用程序池里初始化一个HttpApplication对象,由此对象开始处理之前注册的多个HttpModule。之后调用HandlerFactory创建Handler处理程序,最终处理此次请求

安梓晨的博客 1810

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ASP.NET Core中使用IHttpClientFactory发出HTTP请求

此文是在官方文档的基础上做的个人笔记,一些简单的内容就没用再列出来了,参考官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/http-requests?view=aspnetcore-5.0 IHttpClientFactory有以下几个优势: 便于与Polly、Refit等第三方库继承。 将委托添加到http请求管道中,实现类似asp.net core中间件的功能。 因为复用HttpClientMessageHandler可.

catshitone的专栏 1924

ASP.NET Core HTTP Abstractions 项目教程

ASP.NET Core HTTP Abstractions 项目教程 1. 项目介绍 项目概述 ASP.NET Core HTTP Abstractions 是一个已被归档的项目,提供了 HTTP 抽象层,包括 HttpRequest、HttpResponse 和 HttpContext 等核心类,以及一些常用的 Web 工具。该项目的主要目的是为 ASP.NET Core 应用程序提供统一的 ...

gitblog_00916的博客 1321

关于使用ASP.NET Core发出HTTP请求遇到的一些问题及总结

关于使用ASP.NET Core发出HTTP请求遇到的一些问题及总结使用IHttpClientFactory发出HTTP请求重点理解HttpClient和生存期管理问题 使用IHttpClientFactory发出HTTP请求 可以注册 IHttpClientFactory 并将其用于配置和创建应用中的 HttpClient 实例。 具体文档可参考 微软官方文档. 重点理解HttpClient和生存期管理问题 在开发过程中我使用IHttpClientFactory创建出HttpClient去请求第三方服务

Sysdark的博客 801

ASP.NET Core中如何调整HTTP请求大小的几种方式

一、前言 一般的情况下,我们都无需调用HTTP请求的大小,只有在上传一些大文件,或者使用HTTP协议写入较大的值时(如调用WebService)才可能会调用HTTP最大请求值。 在ASP.NET Core 2.0中,它的两个宿主服务器Kestrel和HttpSys默认的HTTP最大请求大小为30MB (~28.6 MiB)。 如果当HTTP请求值大于这个默认配置时,在执行Requ

dotNET跨平台 4285

在 ASP.NET Core 中使用 IHttpClientFactory 发出 HTTP 请求

通过使用,你可以更有效地管理HttpClient实例,同时享受 ASP.NET Core 提供的强大功能。始终记得遵循最佳实践,比如不要直接在构造函数中调用方法,而是将其封装在服务中,并通过构造函数注入这些服务。

学习和分享 609

(6)ASP.NET Core2.2 中使用IHttpClientFactory发出HTTP请求

HttpClient类的使用所存在的问题,百度搜索的文章一大堆,好多都是单纯文字描述,让人感觉不太好理解,为了更好理解HttpClient使用存在的问题,下面让我们通过代码跟示例来描述。

wzk153的博客 1099

如何在 ASP.NET Core 6 中使用 HTTP 日志记录

ASP.NET Core 中包含的 HTTP 日志记录中间件允许您记录请求和响应数据,包括标头、正文和通用属性。我们将在本文的后续部分中使用该项目来处理 HTTP 日志记录。ASP.NET Core 6 中的 HTTP 日志记录中间件可用于记录 ASP.NET 6 应用程序中的请求和响应。请注意,使用 HTTP 日志记录可能会损害应用程序的性能,尤其是在记录请求和响应主体时。实际上ASP.NET Core默认开启了HTTP日志记录功能,下面是创建项目时Startup类的Configure方法的默认代码。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 941

【ASP.NET Core】探讨注入EF Core的DbContext在HTTP请求中的生命周期

本文将探讨ASP.NET Core中通过DI注入EF Core的DbContext在HTTP请求中的生命周期

Arabys的博客 955

http请求头_ASP.NET Core实现Http自定义请求头策略

(给DotNet加星标,提升.Net技能)转自:lex-wucnblogs.com/lex-wu/p/13301272.html前言在正常的情况下,当我们系统用到JWT认证方式时,需要在Http请求头添加Authorization: XXX,这样在后台服务的控制器中打上[Authorize]授权标签,就限定所有的请求必须通过鉴权方可访问。在ASP.NET Core - 基于IHttpCo...

weixin_39537977的博客 1351

ASP.NET CORE,ASP.NET MVC 使用FormData请求接口—HttpClient使用FormData请求接口,.NET HTTP请求接口multipart/form-data

ASP.NET CORE 使用FormData请求接口 在获取请求接口通常都是使用的json传递参数,首次遇到在客户提供接口需要FormData作为请求参数,找网上一顿找也没有找到一个合适的,到最后还是在官网中看到MultipartFormDataContent类,总算是找到对应的解决方案啦 string url = "http://127.0.0.1/test"; //接口请求地址 string boundary = DateTime.Now.Ticks.

qq_37290531的博客 2232
上一篇: ASP.NET Core 2.2 基础知识(十三)【服务器】
下一篇: ASP.NET Core 高级(一)【.NET 的开放 Web 接口 (OWIN)】
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值