web-dev-qa-db-ja.com

WCFホスティング:svcファイルにアクセスできますが、wsdlリンクにアクセスできません

IIS 7.5でホストされているWCFサービスがあります。テスト用と本番用の2つのサーバーがあります。

このサービスはテストサーバーでは正常に機能しますが、運用サーバーでは次のエラーが発生します。

アドレスにアクセスするとhttp://..../service.svc次のようなデフォルトのページが表示されます。


サービスを作成しました。

このサービスをテストするには、クライアントを作成し、それを使用してサービスを呼び出す必要があります。これは、次の構文でコマンドラインからsvcutil.exeツールを使用して実行できます。

svcutil.exe http://..../service.svc?wsdl

これにより、クライアントクラスを含む構成ファイルとコードファイルが生成されます。 2つのファイルをクライアントアプリケーションに追加し、生成されたクライアントクラスを使用してサービスを呼び出します。


しかし、wsdlリンクをクリックすると、wsdlページに移動できません。エラーなしでこのデフォルトのWebページに戻ります。ネットワーク/ファイアウォール認証エラーが疑われますが、誰かがこのような経験をしていますか?

すべてのIIS設定は、テストサーバーと本番サーバーで同じです。

よろしくお願いします。

20
Selcuk Sasoglu

同じ問題がありました。 httpsGetEnabledをserviceBehaviors> behaviorに追加して、次のように修正しました。

<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>

多分それは他の誰かを助けます。 4年後にこのヒントが必要だとは思わないでください=)

17
ich2211

WCFサービスのWSDLを参照できるようにするには、基本的に3つのことが必要です。

  1. サービスメタデータを有効にするサービス動作
  2. そのサービスメタデータの動作にhttpGetEnabled = Trueを設定して、httpがそのメタデータを参照できるようにします
  3. サービスのmexエンドポイント

したがって、サーバー側の構成は次のようになります(さらにもう少し多くのものがあります)。

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MetadataBehavior">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <services>
      <service behaviorConfiguration="MetadataBehavior" name="YourService">
        <endpoint address="" 
                  binding="basicHttpBinding" 
                  contract="IYourService" />
        <endpoint address="mex" 
                  binding="mexHttpBinding" 
                  contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>

ポイント1と2は、次の行で処理されます。

<serviceMetadata httpGetEnabled="true" />

サービスをアクティブにするには、<service>タグでそのサービスの動作を参照する必要があります。

ポイント3(MEXエンドポイント)はここのこのセクションです:

<endpoint address="mex" 
          binding="mexHttpBinding" 
          contract="IMetadataExchange" />

Httpの場合、mexHttpBindingを使用し、IMetadataExchangeコントラクトはメタデータ交換用のWCFシステムコントラクトです。

15
marc_s

私はその答えがとても遅いことを知っていますが、私は同じ問題を抱えていました、そして解決策は:

サービス[ServiceContract]に実装されているインターフェースにタグ[OperationContract].svcを追加します。 Visual Studioは、WCF Serviceを選択するとインターフェイスを作成しますが、インターフェイスを削除して、独自のインターフェイスを作成しました。

[ServiceContract]
public interface IService1
{
    [OperationContract]
    void DoWork();
}

私は誰かを助けたいと思っています。

2
Rodolfo Luna