Refit. System.net.http.httprequestException: 'Verbindungsversagen'. Warum wird die Ausnahme ausgelöst und wie kann man s
Posted: 23 Feb 2025, 21:46
Ich verwende das Refit -Paket in einem .NET MAUI -Projekt, um den Server für einen autorisierten Benutzer einen bequemen Zugriff zu gewähren. Mein Server ist ASP.NET Core Web API. Ich gewöhne mich immer noch daran, also kenne ich nicht alle Feinheiten. Ich habe alles gemäß dem Beispiel von YouTube gemacht. In Theorie hätte es funktionieren müssen: < /p>
Hier wird die Anfrage unter Berücksichtigung des Tokens gesendet: < /p> des Web-API-Projekts:
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("FIREBASE_CONFIG"))
}));
builder.Services.AddFirebaseAuthentication();
builder.Services.AddScoped();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
}
}
}
< /code>
Controller:
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 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);
}
}
}
}
< /code>
The error that appears:
System.Net.Http.HttpRequestException: 'Connection failure'.
< /code>
StackTrace:
System.Net.Http.HttpRequestException
Message=Connection failure
Source=Mono.Android
StackTrace:
at Xamarin.Android.Net.AndroidMessageHandler.c__DisplayClass137_0.b__0() in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 562
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.c.b__281_0(Object obj)
at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location ---
at Xamarin.Android.Net.AndroidMessageHandler.DoProcessRequest(HttpRequestMessage request, URL javaUrl, HttpURLConnection httpConnection, CancellationToken cancellationToken, RequestRedirectionState redirectState) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 616
at Xamarin.Android.Net.AndroidMessageHandler.DoSendAsync(HttpRequestMessage request, CancellationToken cancellationToken) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 482
at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler.g__Core|5_0(HttpRequestMessage request, Boolean useAsync, CancellationToken cancellationToken)
at Data_Organizer.APIRequestTools.FirebaseAuthHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) in C:\Users\bredu\Documents\ShortNotes\Data_Organizer\APIRequestTools\FirebaseAuthHttpMessageHandler.cs:line 22
at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.g__Core|5_0(HttpRequestMessage request, Boolean useAsync, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
at Refit.RequestBuilderImplementation.c__DisplayClass15_0`2.d[[Data_Organizer_Core.SummaryRequest, Data_Organizer_Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Data_Organizer_Core.SummaryRequest, Data_Organizer_Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext() in c:\temp\releaser\refit\Refit\RequestBuilderImplementation.cs:line 331
--- End of stack trace from previous location ---
at Refit.Implementation.Generated.Data_OrganizerAPIRequestToolsIGetSummaryFromChatGPTQuery.global::Data_Organizer.APIRequestTools.IGetSummaryFromChatGPTQuery.Execute(SummaryRequest request) in C:\Users\bredu\Documents\ShortNotes\Data_Organizer\obj\Debug\net8.0-android\InterfaceStubGeneratorV2\Refit.Generator.InterfaceStubGeneratorV2\IGetSummaryFromChatGPTQuery.g.cs:line 50
at Data_Organizer.Services.OpenAIAPIRequestService.GetSummaryAsync(String content) in C:\Users\bredu\Documents\ShortNotes\Data_Organizer\Services\OpenAIAPIRequestService.cs:line 35
at Data_Organizer.MVVM.ViewModels.MainPageViewModel.PlayAISummary() in C:\Users\bredu\Documents\ShortNotes\Data_Organizer\MVVM\ViewModels\MainPageViewModel.cs:line 80
at Data_Organizer.MVVM.ViewModels.MainPageViewModel.PlayFeature() in C:\Users\bredu\Documents\ShortNotes\Data_Organizer\MVVM\ViewModels\MainPageViewModel.cs:line 67
at CommunityToolkit.Mvvm.Input.AsyncRelayCommand.AwaitAndThrowIfFailed(Task executionTask) in /_/src/CommunityToolkit.Mvvm/Input/AsyncRelayCommand.cs:line 351
at System.Threading.Tasks.Task.c.b__128_0(Object state)
at Android.App.SyncContext.c__DisplayClass2_0.
b__0() in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.App/SyncContext.cs:line 36
at Java.Lang.Thread.RunnableImplementor.Run() in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Java.Lang/Thread.cs:line 37
at Java.Lang.IRunnableInvoker.n_Run(IntPtr jnienv, IntPtr native__this) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/net8.0/android-34/mcw/Java.Lang.IRunnable.cs:line 84
at Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PP_V(_JniMarshal_PP_V callback, IntPtr jnienv, IntPtr klazz) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:line 22
< /code>
At the same time, requests are normal with Postman, they come with a response. That is, in theory, the problem is not on the server side. Although I'm not sure, I'm also a newbie in the Web API topic...
If you have any questions, ask! I'll be glad and grateful if you help me solve this problem.
Hier wird die Anfrage unter Berücksichtigung des Tokens gesendet: < /p>
Code: Select all
public class FirebaseAuthHttpMessageHandler : DelegatingHandler
{
private readonly IGoogleAuthenticationService _googleAuthenticationService;
public FirebaseAuthHttpMessageHandler(IGoogleAuthenticationService googleAuthenticationService)
{
_googleAuthenticationService = googleAuthenticationService;
}
protected override async Task 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);
}
}
< /code>
Meine Abfrage: < /p>
public interface IGetSummaryFromChatGPTQuery
{
[Post("/api/openai/summary")]
Task Execute([Body] SummaryRequest request);
}
< /code>
Verwenden der Abhängigkeitsinjektion, ich lade all dieses Zeug in das Projekt: < /p>
builder.Services.AddTransient();
builder.Services.AddRefitClient().
ConfigureHttpClient(c => c.BaseAddress = new Uri(serverBaseURL)).
AddHttpMessageHandler();
< /code>
Modell zum Senden und Empfangen von Daten: < /p>
public class SummaryRequest
{
public string Content { get; set; } = string.Empty;
public string Result { get; set; } = string.Empty;
public string Error { get; set; } = string.Empty;
}
< /code>
Der Dienst, in dem die Anforderung mit Abfrage erstellt wird: < /p>
public class OpenAIAPIRequestService : IOpenAIAPIRequestService
{
private readonly IGetSummaryFromChatGPTQuery _getSummaryFromChatGPTQuery;
public OpenAIAPIRequestService(
IGetSummaryFromChatGPTQuery getSummaryFromChatGPTQuery)
{
_getSummaryFromChatGPTQuery = getSummaryFromChatGPTQuery;
}
public async Task 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;
}
}
< /code>
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("FIREBASE_CONFIG"))
}));
builder.Services.AddFirebaseAuthentication();
builder.Services.AddScoped();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
}
}
}
< /code>
Controller:
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 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);
}
}
}
}
< /code>
The error that appears:
System.Net.Http.HttpRequestException: 'Connection failure'.
< /code>
StackTrace:
System.Net.Http.HttpRequestException
Message=Connection failure
Source=Mono.Android
StackTrace:
at Xamarin.Android.Net.AndroidMessageHandler.c__DisplayClass137_0.b__0() in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 562
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.c.b__281_0(Object obj)
at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location ---
at Xamarin.Android.Net.AndroidMessageHandler.DoProcessRequest(HttpRequestMessage request, URL javaUrl, HttpURLConnection httpConnection, CancellationToken cancellationToken, RequestRedirectionState redirectState) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 616
at Xamarin.Android.Net.AndroidMessageHandler.DoSendAsync(HttpRequestMessage request, CancellationToken cancellationToken) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 482
at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler.g__Core|5_0(HttpRequestMessage request, Boolean useAsync, CancellationToken cancellationToken)
at Data_Organizer.APIRequestTools.FirebaseAuthHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) in C:\Users\bredu\Documents\ShortNotes\Data_Organizer\APIRequestTools\FirebaseAuthHttpMessageHandler.cs:line 22
at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.g__Core|5_0(HttpRequestMessage request, Boolean useAsync, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
at Refit.RequestBuilderImplementation.c__DisplayClass15_0`2.d[[Data_Organizer_Core.SummaryRequest, Data_Organizer_Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Data_Organizer_Core.SummaryRequest, Data_Organizer_Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext() in c:\temp\releaser\refit\Refit\RequestBuilderImplementation.cs:line 331
--- End of stack trace from previous location ---
at Refit.Implementation.Generated.Data_OrganizerAPIRequestToolsIGetSummaryFromChatGPTQuery.global::Data_Organizer.APIRequestTools.IGetSummaryFromChatGPTQuery.Execute(SummaryRequest request) in C:\Users\bredu\Documents\ShortNotes\Data_Organizer\obj\Debug\net8.0-android\InterfaceStubGeneratorV2\Refit.Generator.InterfaceStubGeneratorV2\IGetSummaryFromChatGPTQuery.g.cs:line 50
at Data_Organizer.Services.OpenAIAPIRequestService.GetSummaryAsync(String content) in C:\Users\bredu\Documents\ShortNotes\Data_Organizer\Services\OpenAIAPIRequestService.cs:line 35
at Data_Organizer.MVVM.ViewModels.MainPageViewModel.PlayAISummary() in C:\Users\bredu\Documents\ShortNotes\Data_Organizer\MVVM\ViewModels\MainPageViewModel.cs:line 80
at Data_Organizer.MVVM.ViewModels.MainPageViewModel.PlayFeature() in C:\Users\bredu\Documents\ShortNotes\Data_Organizer\MVVM\ViewModels\MainPageViewModel.cs:line 67
at CommunityToolkit.Mvvm.Input.AsyncRelayCommand.AwaitAndThrowIfFailed(Task executionTask) in /_/src/CommunityToolkit.Mvvm/Input/AsyncRelayCommand.cs:line 351
at System.Threading.Tasks.Task.c.b__128_0(Object state)
at Android.App.SyncContext.c__DisplayClass2_0.
b__0() in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.App/SyncContext.cs:line 36
at Java.Lang.Thread.RunnableImplementor.Run() in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Java.Lang/Thread.cs:line 37
at Java.Lang.IRunnableInvoker.n_Run(IntPtr jnienv, IntPtr native__this) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/net8.0/android-34/mcw/Java.Lang.IRunnable.cs:line 84
at Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PP_V(_JniMarshal_PP_V callback, IntPtr jnienv, IntPtr klazz) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:line 22
< /code>
At the same time, requests are normal with Postman, they come with a response. That is, in theory, the problem is not on the server side. Although I'm not sure, I'm also a newbie in the Web API topic...
If you have any questions, ask! I'll be glad and grateful if you help me solve this problem.