2

WCF Web サービスを作成し、IIS でホストしました。web.config は次のようになります。

[...]
<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior name="[Namespace].[ServiceNameBehavior]">
                <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>

    <services>
        <service name="[Namespace].[ServiceName]" behaviorConfiguration="[NameSpace].[ServiceNameBehavior]" >
            <endpoint address="basic" binding="basicHttpBinding" contract="[Namespace].[IService]" />
            <endpoint address="secure" binding="basicHttpsBinding" contract="[Namespace].[IService]" />
        </service>
    </services>
</system.serviceModel>
[...]

アクセスするhttp://localhost/[Namespace]/[ServiceName].svcと、サービスを作成したことを示す通常の Web サービス Web ページが表示されます。それをテストするには、svcutil.exe などを使用してサービスを呼び出す必要があります。

さて..問題は、web.configで定義されているように、このWebサービスに2種類の接続を使用したいことです(実際には、これら2つへのアクセスを制限するだけなので、デフォルトの.svc呼び出しを無効にします)が、 http://localhost/[Namespace]/[ServiceName].svc/basicまたはhttps://localhost/[Namespace]/[ServiceName].svc/secure、空白のページが表示され、ローカルでホストされている PHP ページからサービスにアクセスできません。

これらのバインディングがこのように動作するのは正常ですか? そうでない場合は、どうすれば修正できますか?


更新 1


また、Visual Studio からこれらのエンドポイントのいずれかへの参照を作成しようとすると、次のエラーが発生することにも気付きました。

「https://localhost/[Namespace]/[ServiceName].svc/secure」のダウンロード中にエラーが発生しました。リクエストは HTTP ステータス 400: Bad Request で失敗しました。メタデータに解決できない参照が含まれています: 'https://localhost/[Namespace]/[ServiceName].svc/secure'. コンテンツ タイプ application/soap+xml; charset=utf-8 はサービス https://localhost/[Namespace]/[ServiceName].svc/secure でサポートされていませんでした。クライアントとサービスのバインディングが一致していない可能性があります。リモート サーバーがエラーを返しました: (415) コンテンツ タイプが 'application/soap+xml; であるため、メッセージを処理できません。charset=utf-8' は予期されたタイプの 'text/xml ではありませんでした。charset=utf-8'.. サービスが現在のソリューションで定義されている場合は、ソリューションを構築してサービス参照を再度追加してみてください。

http://localhost/[Namespace]/[ServiceName].svc への参照を追加するとうまくいきます。

4

1 に答える 1

1

それはすべて私にはうまくいっているように見えます.Service URLとEndpoint URLの概念を混同しているようです:

  • <service>プロトコルごとに要素ごとに 1 つのサービス URL しかありません。これは、テスト ページの取得、サービス参照の追加、および WSDL ドキュメントの取得 (?wsdlクエリ パラメータ経由) に使用されます。
  • また、<endpoint>要素ごとに 1 つのエンドポイント URL があります。/basicこれらは、またはで終わるもの/secureです。これらのURL が行う唯一のことは、SOAP 要求を受け入れることです。それらからメタデータを取得したり、参照したりすることはできません。これには例外が 1 つあります。SOAP リクエストを介してメタデータを返すまたはを/mex使用して、エンドポイントを公開できます。代わりに HTTP(S) GET を介して WSDL を公開しているため、これは完全にオプションであり、あなたの場合は不要です。mexHttpBindingmexHttpsBinding

クライアント側では、Visual Studio で を使用してサービス参照を追加しhttp://localhost/[Namespace]/[Service].svcます。クライアント エンドポイントを手動で定義する場合は、それらのアドレスをそれぞれ および に設定しhttp://localhost/[Namespace]/[Service].svc/basicますhttp://localhost/[Namespace]/[Service].svc/secure

アップデート:

http://localhost/[Namespace]/[Service].svcURL がリクエストに応答しないようにするには、サービス構成でメタデータの公開を無効にします。

<behaviors>
    <serviceBehaviors>
        <behavior name="[Namespace].[ServiceNameBehavior]">
            <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false"/>
            <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
    </serviceBehaviors>
</behaviors>

これを行うと、クライアント コードに新しいサービス参照を追加できなくなりますが、クライアント コードとサーバー コードの両方を制御する運用環境では問題ありません。

于 2012-10-09T18:00:40.037 に答える