私たちのプロジェクトには、httpとhttpsで実行されるJava Webサービスがあります。Webアプリの外部バージョンには、内部でhttpを使用し、外部バージョンではhttpsを使用します。
したがって、アプリケーションでプロキシクラスを作成し、web/app.configでhttpのバインディングを設定しましたが、すべて正常に機能します。
外部アプリケーションで同じサービスのhttpsをサポートするには、コードと構成にどのような変更を加える必要がありますか?可能であれば、説明するコードスニペットを提供してください。
私はMSDNを掘り下げて答えを見つけました。
私の場合、カスタムバインディングを使用していました。
<customBinding>
<binding name="jsonpBinding">
<jsonpMessageEncoding/>
<httpTransport manualAddressing="true"/>
</binding>
</customBinding>
それはサービスで参照されました
<services>
<service name="{YourInfoHere}">
<endpoint address="" binding="customBinding" bindingConfiguration="jsonpBinding" behaviorConfiguration="{YourInfoHere}" contract="{YourInfoHere}"/>
</service>
</services>
HttpsTransportを使用する2番目のバインディングを追加してから、そのバインディングを使用する2番目のサービスを追加するとうまくいきました。最終出力:
<services>
<service name="{YourInfoHere}">
<endpoint address="" binding="customBinding" bindingConfiguration="jsonpBinding" behaviorConfiguration="{YourInfoHere}" contract="{YourInfoHere}"/>
<endpoint address="" binding="customBinding" bindingConfiguration="jsonpBindingHttps" behaviorConfiguration="{YourInfoHere}" contract="{YourInfoHere}"/>
</service>
</services>
<bindings>
<customBinding>
<binding name="jsonpBinding">
<jsonpMessageEncoding/>
<httpTransport manualAddressing="true"/>
</binding>
<binding name="jsonpBindingHttps">
<jsonpMessageEncoding/>
<httpsTransport manualAddressing="true" />
</binding>
</customBinding>
</bindings>
理想的ではないかもしれませんが、機能します。 SSLを機能させるために私が行った変更はこれらだけでした。それはすべてバインディングとトランスポートにあるので、コードは同じままです。
関連するMSDNリンク:
Basichttpbindingを使用していると想定しています。次に、2つのことを行う必要があります。
WCFを使用して、HTTPS経由でリモートWebサービスに接続するクライアントを構築しているとのことですが。
これを行うには、WCFを利用したアプリのクライアント側の構成ファイルを変更し、 http://server.address を https://server.address に置き換えます。 configuration/system.serviceModel/client/endpoint/@addressにあります。そのようです:
<configuration>
<system.serviceModel>
...
<client>
<!-- change only the address string -->
<endpoint address="https://server.name/Whatever"
everything.else.stays.the.same />
</client>
</system.serviceModel>
</configuration>
(構成ファイルへのパスは、通常の.NETルール(ASPNETアプリであるか、サービスであるかなど)によって異なります。)
または、コードで明示的にアドレスを設定できます。
// instantiate new proxy to web service
var svc= new ServiceClient();
var e = svc.Endpoint;
e.Address = new System.ServiceModel.EndpointAddress("https://server.address/JavaServiceUri");
アドレスをハードコーディングするのではなく、構成可能にすることを強くお勧めします。これは、app.configに保存する必要があるという意味ではありませんが、変更可能である必要があります。プロキシも。
HTTPおよびHTTPSの構成 を参照してください:
HTTP経由でWindowsCommunication Foundation(WCF)を使用するには、インターネットインフォメーションサービス(IIS)などのホストを使用するか、HTTPサーバーAPIを使用してHTTP設定を手動で構成する必要があります。このドキュメントでは、HTTPおよびHTTPSを使用する場合のWCFの手動構成について説明します。
また、 HTTPSに必要なWCFバインディング :も参照してください。
最初の本番WCFアプリケーションの作成を終えたところです。これは、本番環境に展開するまで非常にうまく機能しました。突然、どのWCF呼び出しも機能せず、JavaScriptの「TestServiceが定義されていません」というエラーが発生しました。 JSサービスリファレンスの内部を(デバッグモードで)調べると、次のエラーが発生しました。
WebHttpBindingをバインドしているエンドポイントのスキームhttpに一致するベースアドレスが見つかりませんでした。登録されているベースアドレススキームは[https]です。
したがって、WCFサービスは(SSLを介しているため)HTTPSとして登録されているようですが、バインディングはHTTP用にのみ構成されていました。解決策は、Web.Configファイル内にカスタムバインディングを定義し、セキュリティモードを「トランスポート」に設定することです。次に、エンドポイント定義内のbindingConfigurationプロパティを使用して、カスタムバインディングを指す必要があります。 HTTPS対応のsystem.serviceModelセクション全体を以下に示します。