web-dev-qa-db-ja.com

HttpおよびHttpsを介してWCFを使用してWebサービスを呼び出す

私たちのプロジェクトには、httpとhttpsで実行されるJava Webサービスがあります。Webアプリの外部バージョンには、内部でhttpを使用し、外部バージョンではhttpsを使用します。

したがって、アプリケーションでプロキシクラスを作成し、web/app.configでhttpのバインディングを設定しましたが、すべて正常に機能します。

外部アプリケーションで同じサービスのhttpsをサポートするには、コードと構成にどのような変更を加える必要がありますか?可能であれば、説明するコードスニペットを提供してください。

12
Lewis

私は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リンク:

  1. カスタムバインディング: http://msdn.Microsoft.com/en-us/library/ms731377.aspx
  2. HttpTransport: http://msdn.Microsoft.com/en-us/library/system.servicemodel.channels.httptransportbindingelement.aspx
  3. HttpsTransport: http://msdn.Microsoft.com/en-us/library/system.servicemodel.channels.httpstransportbindingelement.aspx
22
jeffreypriebe

Basichttpbindingを使用していると想定しています。次に、2つのことを行う必要があります。

  • アドレスをhttpsに変更します:)
  • セキュリティモードをトランスポートに設定する
2
Shiraz Bhaiji

WCFを使用して、HTTPS経由でリモートWebサービスに接続するクライアントを構築しているとのことですが。

これを行うには、WCFを利用したアプリのクライアント側の構成ファイルを変更し、 http://server.addresshttps://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に保存する必要があるという意味ではありませんが、変更可能である必要があります。プロキシも。

0
Cheeso

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セクション全体を以下に示します。

0
Andrew Hare