Toolbelt.Blazor.HttpClientInterceptor icon indicating copy to clipboard operation
Toolbelt.Blazor.HttpClientInterceptor copied to clipboard

Using with HttpClientFactory

Open Martin-Andersen opened this issue 3 years ago • 2 comments

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;

    }

Martin-Andersen avatar May 10 '21 13:05 Martin-Andersen