Skip to content

Use native HTTP client handlers for Xamarin.iOS and Xamarin.Android #481

@peombwa

Description

@peombwa

Issue

Due to HttpClientHandler's limitations described in issues #413, we need to configure our pipeline to use optimized native Http handlers for Xamarin.Android (AndroidClientHandler) and Xamarin.iOS (NSUrlSessionHandler) as our final handler.

Workaround

The workaround involves setting up a new pipeline for each platform with the platforms native http handler set as the finalHandler. This is cumbersome and can be error prone if not configured correctly.

#if __ANDROID__
            var innerHandler = new Xamarin.Android.Net.AndroidClientHandler { AllowAutoRedirect = false };
            var pipeline = GraphClientFactory.CreatePipeline(GraphClientFactory.CreateDefaultHandlers(authProvider), innerHandler);
            httpProvider = new HttpProvider(pipeline, true, new Serializer());
#elif __IOS__
            var innerHandler = new NSUrlSessionHandler { AllowAutoRedirect = false };
            var handlers = GraphClientFactory.CreateDefaultHandlers(authProvider);
            // Remove CompressionHandler from pipeline when using NSUrlSessionHandler.
            handlers.Remove(handlers.FirstOrDefault((h) => h.GetType().Equals(typeof(CompressionHandler)))); // We need to provide a method to remove handlers by type. 
            var pipeline = GraphClientFactory.CreatePipeline(handlers , innerHandler);
            httpProvider = new HttpProvider(pipeline, true, new Serializer());
#else // UWP
            httpProvider = new HttpProvider();
#endif
            return new GraphServiceClient(authProvider, httpProvider);

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions