Toolbelt.Blazor.HttpClientInterceptor
Toolbelt.Blazor.HttpClientInterceptor copied to clipboard
Using with HttpClientFactory
Trying to get it to work using the IHttpClientFactory. I am getting null in the HttpClientInterceptorEventArgs e argument.
public static async Task Main(string[] args)
{
var b = WebAssemblyHostBuilder.CreateDefault(args);
b.RootComponents.Add<App>("#app");
b.Services.AddHttpClientInterceptor();
// Setup the http client
var samsonApiUrl = new Uri(b.HostEnvironment.BaseAddress + "api/");
b.Services.AddHttpClient("Api", (serviceProvider,client) =>
{
client.BaseAddress = samsonApiUrl;
client.EnableIntercept(serviceProvider);
}).AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
// Supply HttpClient instances that include access tokens when making requests to the server project
b.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient("Api"));
var scope = b.Configuration.GetSection("Scope").Value;
b.Services.AddMsalAuthentication(options =>
{
options.UserOptions.RoleClaim = "role";
b.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
options.ProviderOptions.DefaultAccessTokenScopes.Add(scope);
}).AddAccountClaimsPrincipalFactory<CustomUserFactory>();
b.Services.AddOptions();
b.Services.AddAuthorizationCore();
b.Services.AddScoped<HttpInterceptorService>();
b.Services.AddTransient<ILoggingTestService, LoggingTestService>();
await b.Build().RunAsync();
}
public class HttpInterceptorService
{
private readonly HttpClientInterceptor _interceptor;
private readonly NavigationManager _navManager;
public HttpInterceptorService(HttpClientInterceptor interceptor, NavigationManager navManager)
{
_interceptor = interceptor;
_navManager = navManager;
}
public void MonitorEvent() => _interceptor.AfterSend += InterceptResponse;
private void InterceptResponse(object sender, HttpClientInterceptorEventArgs e)
{
if (e.Response.IsSuccessStatusCode) return;
var responseCode = e.Response.StatusCode;
string message;
switch (responseCode)
{
case HttpStatusCode.NotFound:
_navManager.NavigateTo("/404");
message = "The requested resorce was not found.";
break;
case HttpStatusCode.Unauthorized:
case HttpStatusCode.Forbidden:
_navManager.NavigateTo("/unauthorized");
message = "You are not authorized to access this resource. ";
break;
default:
_navManager.NavigateTo("/500");
message = "Something went wrong, please contact Administrator";
break;
}
throw new HttpRequestException(message);
}
public void DisposeEvent() => _interceptor.AfterSend -= InterceptResponse;
}