Xamarin + WCF + SSL + 传输 + 证书
Xamarin + WCF + SSL + Transport + Certificate
我有一个 Net Framework 4.5 WCF 服务,运行 async/task 方法。它部署在有效的 URL 上,具有正确的 Digicert 证书,确保域。我们有一个 "client certificate",带有一个 "one-to-one" 映射,并且对于我们的 "Winforms" 应用程序来说一切正常。
现在,我们不想从 Android/iOS Xamarin 项目中调用它。
我们知道 Xamarin 不支持 wsBinding,所以我们正在使用这个配置:
服务器
<system.serviceModel>
<services>
<service
name="serviceWCF.nameService"
behaviorConfiguration="behavior_base">
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="transport"
contract="serviceWCF.nameInterfaceService" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="transport">
<security mode="Transport" >
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="behavior_base">
<serviceMetadata httpsGetEnabled="true" httpsGetUrl=""/>
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
我们从 SVCUTIL.EXE 创建了一个代理,然后我们手动实现了异步方法、通道创建,因为 Xamarin 不支持动态绑定,等等。
我们的 Xamarin 客户端应用程序的代理,它是这样调用的:
BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
AddressHeader addressHeader2;
AddressHeader[] addressHeaders;
EndpointAddress endpoint;
addressHeader2 = AddressHeader.CreateAddressHeader("nameapp_iOS", "https:\URL_WCF_Service.svc", 0);
addressHeaders = new AddressHeader[]{ addressHeader2};
endpoint = new EndpointAddress(new System.Uri("https:\URL_WCF_Service.svc"),addressHeaders);
System.Security.Cryptography.X509Certificates.X509Certificate2 oCert;
oCert = new System.Security.Cryptography.X509Certificates.X509Certificate2(System.IO.File.ReadAllBytes("CertBundle.pfx"), "pass");
Service_MovilClient oProxy = new Service_MovilClient(binding, endpoint);
Service_MovilClient oProxy.ClientCredentials.ClientCertificate.Certificate = oCert
但是...没有任何反应...超时....
服务器没问题。可以从 iOS 模拟器访问 url。我们只能使用 "basicHttpBinding",但是,我们想使用 SSL+客户端证书。
有什么想法吗?现在我卡住了。
再多的努力也白费了。到目前为止,WCF Xamarin 非常短。
我必须接受 HTTPs 和基本的传输安全(安全模式="Transport")。
我必须使用那个 Wcf 服务...但是如果你,可怜的人,正在阅读这个之前的新开发,请使用 REST 服务。他们有更好的 Xamarin 支持。
我有一个 Net Framework 4.5 WCF 服务,运行 async/task 方法。它部署在有效的 URL 上,具有正确的 Digicert 证书,确保域。我们有一个 "client certificate",带有一个 "one-to-one" 映射,并且对于我们的 "Winforms" 应用程序来说一切正常。 现在,我们不想从 Android/iOS Xamarin 项目中调用它。 我们知道 Xamarin 不支持 wsBinding,所以我们正在使用这个配置:
服务器
<system.serviceModel>
<services>
<service
name="serviceWCF.nameService"
behaviorConfiguration="behavior_base">
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="transport"
contract="serviceWCF.nameInterfaceService" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="transport">
<security mode="Transport" >
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="behavior_base">
<serviceMetadata httpsGetEnabled="true" httpsGetUrl=""/>
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
我们从 SVCUTIL.EXE 创建了一个代理,然后我们手动实现了异步方法、通道创建,因为 Xamarin 不支持动态绑定,等等。
我们的 Xamarin 客户端应用程序的代理,它是这样调用的:
BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
AddressHeader addressHeader2;
AddressHeader[] addressHeaders;
EndpointAddress endpoint;
addressHeader2 = AddressHeader.CreateAddressHeader("nameapp_iOS", "https:\URL_WCF_Service.svc", 0);
addressHeaders = new AddressHeader[]{ addressHeader2};
endpoint = new EndpointAddress(new System.Uri("https:\URL_WCF_Service.svc"),addressHeaders);
System.Security.Cryptography.X509Certificates.X509Certificate2 oCert;
oCert = new System.Security.Cryptography.X509Certificates.X509Certificate2(System.IO.File.ReadAllBytes("CertBundle.pfx"), "pass");
Service_MovilClient oProxy = new Service_MovilClient(binding, endpoint);
Service_MovilClient oProxy.ClientCredentials.ClientCertificate.Certificate = oCert
但是...没有任何反应...超时....
服务器没问题。可以从 iOS 模拟器访问 url。我们只能使用 "basicHttpBinding",但是,我们想使用 SSL+客户端证书。
有什么想法吗?现在我卡住了。
再多的努力也白费了。到目前为止,WCF Xamarin 非常短。 我必须接受 HTTPs 和基本的传输安全(安全模式="Transport")。
我必须使用那个 Wcf 服务...但是如果你,可怜的人,正在阅读这个之前的新开发,请使用 REST 服务。他们有更好的 Xamarin 支持。