You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
When I try to create a handler in the client for a gRPC service HttpClientHandler.ClientCertificates is null #73960
When I debug the WPF project and set a breakpoint at the end of the method, the prperty miHandler.ClientCertificates in the method in the library class is not null. However, if I debug the MAUI project in an android phone and debug, the property miHandler.ClientCertificates is null.
My objective it is to use a gRPC client that uses certificates and I could use in many clients, MAUI and WPF in this case. But if the ClientCertificates property is null, I can't set the certificates in the MAUI project.
1.- Create a new solution.
2.- Create a class library with target is .NET 6.0.
3.- Create a class with a method with the code that create a new HttpCientHander.
4.- Create a MAUI project with target .NET 6.0.
5.- Create a button that instantiate an object of the class library.
6.- Debug the MAUI project and see the value of the property miHanlder.ClientCertificates. It should to be null (this is the error)
7.- Create a WPF application that targets .NET 6.0.
8.- Add a new button which code instantiate an onject of type of the class in the library.
9.- Debug the WPF project and check the value of miHandler.ClientCertificates property. It should be not null. This is correct.
Hi @ComptonAlvaro! The HttpClientHandler uses Xamarin's native AndroidMessageHandler under the hood by default and it doesn't seem to support the ClientCertificates property (even though it has that property).
What you should try is adding the following property to your csproj file:
This will force HttpClientHandler to use System.Net.Http.SocketsHttpHandler instead which should be suitable for your use case. Let me know if this solves your problem.
Now the question if it AndroidMessageHandler will support ClientCertificates to avoid to do this setup, because it would be more intiuitve, because when I use .NET 6 and it is said it can be used by MAUI, I expect that it will can use in other the projects that can reference this library.
One alternative is also to use HttpMessageHandler miHttpHandler = new SocketsHttpHandler(); and pass that to gRPC.
This will allow you to not set <UseNativeHttpHandler>false</UseNativeHttpHandler> in the .csproj so other parts of your app still use the native http handler (which is the recommended one for most scenarios).
@simonrozsival do you think we can implement ClientCertificates support in the Android native handler? Or should we work with gRPC folks to default to the Sockets handler on Android?
@ComptonAlvaro I'm glad that helped. Thanks for the feedback, we should consider extending the functionality of the native handler in future .NET releases.
But in this case, @ComptonAlvaro needs to configure the handler in a specific way and so the handler must be created manually and then passed to the GrpcChannel. Implementing the support should be doable by wrapping ClientCertificates in a custom KeyStore, but I'm not sure how it fits in our .NET 8 plans. /cc @steveisok
The issue isn't specific to gRPC and it describes missing functionality in Xamarin.Android. I opened a new issue in the Xamarin Android repository and so I'm now closing this issue.
Activity
akoeplinger commentedon Aug 16, 2022
/cc @simonrozsival
simonrozsival commentedon Aug 16, 2022
Hi @ComptonAlvaro! The
HttpClientHandleruses Xamarin's nativeAndroidMessageHandlerunder the hood by default and it doesn't seem to support theClientCertificatesproperty (even though it has that property).What you should try is adding the following property to your csproj file:
This will force
HttpClientHandlerto useSystem.Net.Http.SocketsHttpHandlerinstead which should be suitable for your use case. Let me know if this solves your problem.ComptonAlvaro commentedon Aug 16, 2022
@simonrozsival Thanks for your suggestion.
It works.
Now the question if it AndroidMessageHandler will support ClientCertificates to avoid to do this setup, because it would be more intiuitve, because when I use .NET 6 and it is said it can be used by MAUI, I expect that it will can use in other the projects that can reference this library.
Thanks.
akoeplinger commentedon Aug 16, 2022
One alternative is also to use
HttpMessageHandler miHttpHandler = new SocketsHttpHandler();and pass that to gRPC.This will allow you to not set
<UseNativeHttpHandler>false</UseNativeHttpHandler>in the .csproj so other parts of your app still use the native http handler (which is the recommended one for most scenarios).@simonrozsival do you think we can implement
ClientCertificatessupport in the Android native handler? Or should we work with gRPC folks to default to the Sockets handler on Android?simonrozsival commentedon Aug 16, 2022
@ComptonAlvaro I'm glad that helped. Thanks for the feedback, we should consider extending the functionality of the native handler in future .NET releases.
@akoeplinger The sockets handler is already the default HTTP handler in .NET 5+ on gRPC, see https://github.com/grpc/grpc-dotnet/blob/7ef184f3c4cd62fbc3cde55e4bb3e16b58258ca1/src/Shared/HttpHandlerFactory.cs#L33.
But in this case, @ComptonAlvaro needs to configure the handler in a specific way and so the handler must be created manually and then passed to the GrpcChannel. Implementing the support should be doable by wrapping ClientCertificates in a custom KeyStore, but I'm not sure how it fits in our .NET 8 plans. /cc @steveisok
simonrozsival commentedon Aug 17, 2022
The issue isn't specific to gRPC and it describes missing functionality in Xamarin.Android. I opened a new issue in the Xamarin Android repository and so I'm now closing this issue.