Задать вопрос
Luffy1
@Luffy1
Student, Junior .NET programmer, C#, JS, HTML/CSS

Refit. System.Net.Http.HttpRequestException: 'Connection failure'. Почему вызывается исключение и как решить?

Я использую Refit package на .NET MAUI проекте, чтоб организовать удобный доступ к серверу для авторизованного юзера. Сервер у меня - ASP.NET Web Api. Я пока ещё в нём только осваиваюсь, поэтому не знаю всех тонкостей. Делал всё по примеру с ютуба, по идее, должно было сработать:

Тут происходит отправка запроса с учётом токена:
public class FirebaseAuthHttpMessageHandler : DelegatingHandler
{
    private readonly IGoogleAuthenticationService _googleAuthenticationService;

    public FirebaseAuthHttpMessageHandler(IGoogleAuthenticationService googleAuthenticationService)
    {
        _googleAuthenticationService = googleAuthenticationService;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        string? firebaseToken = await _googleAuthenticationService.GetFreshToken();

        if (firebaseToken != null)
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", firebaseToken);

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


Мой Query:
public interface IGetSummaryFromChatGPTQuery
{
    [Post("/api/openai/summary")]
    Task<SummaryRequest> Execute([Body] SummaryRequest request);
}


С помощью Dependency Injection в проект подгружаю всё это дело:
builder.Services.AddTransient<FirebaseAuthHttpMessageHandler>();

builder.Services.AddRefitClient<IGetSummaryFromChatGPTQuery>().
        ConfigureHttpClient(c => c.BaseAddress = new Uri(serverBaseURL)).
        AddHttpMessageHandler<FirebaseAuthHttpMessageHandler>();


Модель для отправки и получения данных:
public class SummaryRequest
{
    public string Content { get; set; } = string.Empty;
    public string Result { get; set; } = string.Empty;
    public string Error { get; set; } = string.Empty;
}


Сервис, где происходит запрос с помощью Query:
public class OpenAIAPIRequestService : IOpenAIAPIRequestService
    {
        private readonly IGetSummaryFromChatGPTQuery _getSummaryFromChatGPTQuery;

        public OpenAIAPIRequestService(
            IGetSummaryFromChatGPTQuery getSummaryFromChatGPTQuery)
        {
            _getSummaryFromChatGPTQuery = getSummaryFromChatGPTQuery;
        }

        public async Task<SummaryRequest> GetSummaryAsync(string content)
        {
            var requestData = new SummaryRequest
            {
                Content = content
            };

            SummaryRequest response;

            try
            {
                response = await _getSummaryFromChatGPTQuery.Execute(requestData);

                if (!string.IsNullOrWhiteSpace(response.Error))
                    throw new Exception(response.Error);
            }
            catch (Exception)
            {
                throw;
            }

            return response;
        }
    }


Program.cs сервера:
using Data_Organizer_Server.Interfaces;
using Data_Organizer_Server.Services;
using FirebaseAdmin;
using FirebaseAdminAuthentication.DependencyInjection.Extensions;
using Google.Apis.Auth.OAuth2;

namespace Data_Organizer_Server
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            builder.Services.AddControllers();

            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            builder.Services.AddAuthorization();

            builder.Services.AddSingleton(FirebaseApp.Create(new AppOptions()
            {
                Credential = GoogleCredential.FromJson(builder.Configuration.GetValue<string>("FIREBASE_CONFIG"))
            }));
            builder.Services.AddFirebaseAuthentication();

            builder.Services.AddScoped<IOpenAIService, OpenAIService>();

            var app = builder.Build();

            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseHttpsRedirection();

            app.UseAuthentication();
            app.UseAuthorization();

            app.MapControllers();

            app.Run();
        }
    }
}


Контроллер:
using Data_Organizer_Core;
using Data_Organizer_Server.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Data_Organizer_Server.Controllers
{
    [Authorize]
    [ApiController]
    [Route("api/openai")]
    public class OpenAIController : ControllerBase
    {
        private readonly IOpenAIService _openAIService;

        public OpenAIController(IOpenAIService openAIService)
        {
            _openAIService = openAIService;
        }

        [HttpPost("summary")]
        public async Task<IActionResult> GetSummary([FromBody] SummaryRequest request)
        {
            if (request == null || string.IsNullOrWhiteSpace(request.Content))
            {
                return BadRequest("Порожній запит або відсутній контент!");
            }

            try
            {
                request.Result = await _openAIService.GetSummary(request.Content);
                return Ok(request);
            }
            catch (Exception ex)
            {
                request.Error = ex.Message;
                return StatusCode(500, request);
            }
        }
    }
}


Ошибка, которая появляется: System.Net.Http.HttpRequestException: 'Connection failure'.

При этом с Postman запросы идут нормально, приходят с ответом. То есть, в теории, проблема не на стороне сервера. Хотя не уверен, в теме Web API я тоже новичок...

Если будут вопросы, то спрашивайте! Буду рад и благодарен, если поможете разобраться.
  • Вопрос задан
  • 36 просмотров
Подписаться 1 Средний 7 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы