ASP.NET Core 확장 라이브러리의 Http 공통 확장 라이브러리 사용 상세 정보

본고는 Xfrogcn을 소개할 것이다.AspNetCore.Extensions 확장 라이브러리는 Http와 관련된 다른 기능 확장에 대한 일반적인 수요를 처리하는 데 목적을 둔다. 요청 버퍼, 요청 헤더 전달, 요청 헤더 로그 범위, HttpClient와 HttpRequestMessage, HttpResponseMessage에 대한 확장 방법을 포함한다.

1. 서버 요청 버퍼 열기


    ASP.NET Core에서 요청체를 여러 번 읽을 수 없습니다. MVC에서 프레임워크가 요청체를 읽었기 때문에 컨트롤러에서 다시 읽으면 다음과 같은 예외가 발생합니다.

    [ApiController]
    [Route("[controller]")]
    public class TestController : ControllerBase
    {
 
        public TestController()
        {

        }

        [HttpPost]
        public async Task<WeatherForecast> Save([FromBody]WeatherForecast enttiy)
        {
            using (StreamReader reader = new StreamReader(Request.Body))
            {
                Request.Body.Position = 0;
                string response = await reader.ReadToEndAsync();
            }
            return enttiy;
        }
    }
Post를 통해/test 인터페이스를 요청할 때 문장 Request.Body.위치에서 예외가 발생합니다.

System.NotSupportedException: Specified method is not supported.
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpRequestStream.set_Position(Int64 value)
물론 실제적으로는 예시처럼 요청을 처리하지 않을 수도 있지만 업무 수요에서 요청체를 여러 번 읽는 경우가 있을 수 있다.
요청 버퍼를 열면 요청체를 여러 번 읽는 문제를 해결할 수 있습니다. Xfrogcn.AspNetCore.Extensions 확장 라이브러리는 요청 버퍼를 열 때 EnableBufferingAttribute 기능을 제공합니다. 이 기능을 컨트롤러나 Action 방법에 사용할 수 있습니다.
위의 예제에서는 EnableBuffering 특성을 Save 메서드에 추가하기만 하면 됩니다.

    [HttpPost]
    [EnableBuffering]
    public async Task<WeatherForecast> Save([FromBody]WeatherForecast enttiy)
    {
        ....
    }

2. 요청 헤더 전달


마이크로 서비스 구조에서 일반적으로 우리는 요청 헤더를 사용하여 요청의 체인 추적과 로그와 요청의 관련을 실현한다. 예를 들어 x-request-id를 통해 로그 시스템에서 모든 서비스에 요청된 로그를 직접 볼 수 있다.
확장 라이브러리는 HttpClient 요청 파이프를 차단하여 지정된 요청 헤더에 대한 자동 전달을 실현할 수 있습니다.기본 설정에서 확장 라이브러리는 자동으로'x-'로 시작하는 요청 헤더를 전달합니다. 다른 요청 헤더를 전달해야 한다면 설정의 TrackingHeaders를 통해 추가할 수 있습니다.

    IServiceCollection services = new ServiceCollection()
        .AddExtensions(null, config =>
        {
            //  my- 
            config.TrackingHeaders.Add("my-*");
        });

3. 요청 헤더 로그의 기록


    .NET Core 로그 프레임워크에서 로그 범위의 개념을 실현하여 로그 범위를 통해 로그 시스템이 현재 상하문의 정보를 기록할 수 있도록 한다. 예를 들어 ASP.NET Core MVC의 로그 범위에는 ActionContext 관련 정보가 포함되어 있으므로 요청된 모든 로그에 Action 관련 정보를 자동으로 기록할 수 있습니다.
확장 라이브러리는 설정된 요청 헤더를 요청한 로그 범위에 추가할 수 있습니다. 예를 들어 기본 설정에서 확장 라이브러리는 x-request-id를 요청한 로그 범위에 추가하기 때문에 단일 요청의 모든 로그는 x-request-id 정보를 자동으로 가지고 크로스 서비스의 로그 연결을 실현할 수 있습니다.다른 요청 헤더를 포함하려면 구성의 HttpHeaders를 통해 설정할 수 있습니다.

    IServiceCollection services = new ServiceCollection()
        .AddExtensions(null, config =>
        {
            //  my-id 
            config.HttpHeaders.Add("my-id");
        });
주의: 기본 컨트롤러 로그, 파일 로그는 로그 범위에 대한 정보를 저장하지 않습니다. json 형식의 컨트롤러 로그나 파일 로그를 사용하면 로그 범위의 데이터를 저장할 수 있습니다.

    IServiceCollection services = new ServiceCollection()
        .AddExtensions(null, config =>
        {
            config.ConsoleJsonLog = true;
        });

4. Http 메시지의 확장 방법


확장 라이브러리는 요청 메시지를 읽기와 쓰기에 편리하도록 HttpRequest Message에 GetObjectasync, WriteObjectasync 확장 방법을 제공합니다.HttpResponse Message에서 GetObjectasync, WriteObjectasync 확장 방법을 제공하여 응답 메시지에 대한 읽기와 쓰기를 편리하게 합니다.이 방법들은 모두 json 형식을 채택한다.
예:

    public class WeatherForecast
    {
        public DateTime Date { get; set; }

        public int TemperatureC { get; set; }

        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

        public string Summary { get; set; }
    }

    static async Task Main(string[] args)
    {
        IServiceCollection services = new ServiceCollection()
            .AddExtensions(null, config =>
            {
            });

        IServiceProvider serviceProvider = services.BuildServiceProvider();

        IHttpClientFactory factory = serviceProvider.GetRequiredService<IHttpClientFactory>();
        HttpClient client = factory.CreateClient();

        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://localhost:5000/test");
        
        //  
        await request.WriteObjectAsync(new WeatherForecast()
        {
            Date = DateTime.Now
        });
        request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        //  
        var entity = await request.GetObjectAsync<WeatherForecast>();

        HttpResponseMessage response = await client.SendAsync(request);

        //  
        entity = await response.GetObjectAsync<WeatherForecast>();

        Console.ReadLine();
    }

5. HttpClient에서의 확장 방법


HttpClient를 더욱 편리하고 신속하게 사용하기 위해 확장 라이브러리는 HttpClient에 여러 가지 확장 방법을 추가했다.
  • PostAsync: 서버로 대상을 보내고 지정된 유형의 응답을 받습니다
  • PostAsync: 서버로 대상을 보내고 응답 문자열을 가져옵니다
  • GetAsync: Get 요청을 보내고 TResponse 유형의 응답을 받습니다
  • GetAsync: Get 요청을 보내고 String 유형의 응답을 받습니다
  • SubmitFormAsync: 서버에 폼 데이터를 제출하고 TResponse 형식의 응답을 얻습니다
  • SubmitFormAsync: 서버에 폼 데이터를 제출하고 String 형식의 응답을 받습니다
  • UploadFileAsync: 마지막 로컬 파일
  • UploadStreamAsync: 서버에 스트리밍 데이터 업로드
  • 이러한 확장 방법에 대한 상세한 설명은 문서를 참고할 수 있습니다GitHub Gitee
        Xfrogcn.AspNetCore.Extensions 주소:GitHub Gitee
    지금까지 ASP였습니다.NET Core 확장 라이브러리의 Http 공통 확장 라이브러리 사용에 대한 자세한 내용은 ASP에 관한 것입니다.NET Core Extension Library의 Http 공통 Extension Library 자료

    좋은 웹페이지 즐겨찾기