servicestack,C#,Android,Ssl,Xamarin,servicestack" /> servicestack,C#,Android,Ssl,Xamarin,servicestack" />

Android Xamarin C#:带有ServiceStack和自签名证书的Https

Android Xamarin C#:带有ServiceStack和自签名证书的Https,c#,android,ssl,xamarin,servicestack,C#,Android,Ssl,Xamarin,servicestack,因此,我将所有Http Web服务更改为Https,使用自签名证书进行测试(针对我正在制作的android应用程序),并且它在服务器端运行良好,我知道这一点,因为我可以将证书添加到我的PC的证书存储中,并完美地访问该站点,当我的android应用程序调用客户端时,我在客户端遇到了什么问题 我的Servicestack调用如下所示: var client = new JsonServiceClient(stubServicesBaseUrl); return cl

因此,我将所有Http Web服务更改为Https,使用自签名证书进行测试(针对我正在制作的android应用程序),并且它在服务器端运行良好,我知道这一点,因为我可以将证书添加到我的PC的证书存储中,并完美地访问该站点,当我的android应用程序调用客户端时,我在客户端遇到了什么问题

我的Servicestack调用如下所示:

        var client = new JsonServiceClient(stubServicesBaseUrl);

        return client.Get(new GetLastStatusUpdate()).StatusUpdates.Last();
在只有http的情况下,这些都可以工作,但自从我添加代码将自签名证书添加到android trusted credentials store之后,这些调用就停止了工作,相反,请求似乎超时了

        byte[] certificate;
        using (var streamReader = new StreamReader(Assets.Open("ScoutTestCert.crt")))
        {
            using (var byteStream = new MemoryStream())
            {
                streamReader.BaseStream.CopyTo(byteStream);
                certificate = byteStream.ToArray();
            }
        }

        var installCertificate = KeyChain.CreateInstallIntent();
        installCertificate.PutExtra(KeyChain.ExtraCertificate, certificate);
        StartActivity(installCertificate);
上面的代码将证书添加到“用户”部分的android trusted store中,并允许我通过androidEmulator上的internet应用导航到该站点,而不会出现问题,因此似乎只有在尝试在我的应用程序代码中调用ServiceStack时才会出现问题

我的代码中是否缺少一些东西,比如服务堆栈需要的额外设置或类似的东西?我已经为这个问题挣扎了几天了,现在正处于一个真正的路障! 我试图将webservice调用保持为servicestack,因为我希望它是PCL,而不是特定于android的代码

谢谢。

ServiceStack使用.NET的BCL内置的
HttpWebRequest
,为了使自签名证书与.NET HTTP客户端一起工作,您需要注册一个,例如,下面的回调将使所有证书成功:

ServicePointManager.ServerCertificateValidationCallback += 
    (sender, certificate, chain, sslPolicyErrors) => true;
但是,您可能希望将验证限制为使用自签名证书

使用ServiceStack的基于HttpWebRequest的服务客户端的另一种选择是使用,它的优点是可以将其配置为使用:

它不使用.NET HTTP客户端堆栈,而是使用底层iOS和Android平台上可用的本机HTTP库。这将允许您使用在Android上注册的任何证书


为了使用在.NET中使用ModernHttpClient注册的不受信任的自签名证书,您需要使用as.

所以我尝试将ServerCertificateValidationCallback行添加到我的应用程序中,作为第一件事,以便接受任何证书(只是为了测试这对我有效),而我似乎仍然得到相同的证书“WebException:请求超时“错误消息。我不明白为什么会发生这种异常,我读到它是因为请求正在发送,而没有收到任何回复,这是正确的吗?我想我的下一步行动可能是尝试另一个xamarin android内置的https服务,看看它是否有希望奏效。@wootank不确定,但我首先会考虑让一个基本的.NET直接使用url工作,即:
(HttpWebRequest)WebRequest.Create(“url”)
,这将删除.NET BCL类之上的任何附加层。如果它不起作用,我会向Xamarin提交一份bug报告,这样他们就可以告诉你根本的问题是什么。嘿,谢谢你的帮助,最后我们决定单独向JsonHttpClient和ModernHttpClient提出你的第二个建议,一切都很顺利:)
JsonHttpClient.GlobalHttpMessageHandlerFactory = () => 
    new NativeMessageHandler()