2016-10-28 8 views
2

私はAsync/Taskメソッドで動作するNetFlow 4.5 WCFサービスを持っています。正しいDigicert証明書を使用して有効なURLに配備され、ドメインを保証します。私たちは "1対1"のマッピングを持つ "クライアント証明書"を持っていて、 "Winforms"アプリのためにすべてOKです。 Android/iOS Xamarinプロジェクトから呼び出すことはできません。 我々はXamarinはのWSBindingをサポートしていないので、私たちは、この設定を使用しているしていることを知っている:私たちはSVCUTIL.EXEからプロキシを作成しXamarin + WCF + SSL +トランスポート+証明書

サーバー

<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> 

、そして我々は、手動で非同期メソッドを実装しています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 

しかし...何も起こりません...時間を....

それは大丈夫ですサーバー。 urlには、iOSエミュレータからアクセスできます。 "basicHttpBinding"だけで使用できますが、SSL +クライアント証明書を使用したいと考えています。

アイデア?今私は立ち往生している。

+0

特に、このファイルに秘密鍵が必要であるため、すべての電話機に証明書ファイルを持たせることをお勧めします。 Xamarin大学にはAuthに関するビデオがあり、可能なすべてのシナリオについて話し合っています。あなたがそれにアクセスできるなら、私はそれを見ることをお勧めします。また、Xamarinのプロキシを作成するには、Silverlightツールを使用するか、VS Studioから実行する必要があります。 ASASK svcutilプロキシはXamarinには適していません。 VSからすべてのプロキシを生成します。 –

+0

@YuriS私はリスクの逆コンパイルを考えていませんが、私はあなたの考えを理解しています。悲しいことに、私はbasichttpbindingに自分自身を準拠させる必要があります。なぜなら、より良い選択肢が得られないからです。 – Caveman

+1

certsの代わりにusername/password authを使用できますか? –

答えて

1

これ以上の努力を払うのは無駄です。これまでのところ、WCF Xamarinは非常に短いです。 私はHTTPと基本的なトランスポートセキュリティ(セキュリティモード= "トランスポート")で解決する必要があります。

私はそのWcfサービスを使用する必要があります...しかし、あなたが哀れな人間は、これまでの新しい開発を読んでいるなら、RESTサービスを使用してください。彼らはXamarinよりはるかに優れたサポートフォームを持っています。