2009-11-01 15 views
11

IISでホストされているときにうまく動作するWCF Sericeを作成しました。無効な操作例外

は今、私は、同じサービスを取って、WPFでホストアプリケーションを作成し、そのアプリケーションからサービスを開始しようとすると、私はこの例外を取得:

The HttpGetEnabled property of ServiceMetadataBehavior is set to true and the 
HttpGetUrl property is a relative address, but there is no http base address. 
Either  supply an http base address or set HttpGetUrl to an absolute address. 
+0

解決しています

プロキシを作成するために、あなたのコードは何ですか? – Dani

+0

productsServiceHost =新しいServiceHost(typeof(Products.ProductsService)); productsServiceHost.Open(); stop.IsEnabled = true; start.IsEnabled = false; status.Text = "サービスの実行中..."; – Attilah

答えて

22

エラーは非常に明確である - あなたHTTPを使用している場合、ServiceMetadataビヘイビアでHttpGetEnabledを有効にしましたが、設定にベースアドレスを指定していません。

IISでは、* .svcファイルの場所によってサービスアドレスが定義されるため、ベースアドレスは不要で使用されません。あなたがセルフホスティングしているときは、ベースアドレスを使用することができます。

はこのような何かを見て、あなたの設定を変更し

<system.serviceModel> 
    <services> 
    <service name="YourService"> 
     <host> 
     <baseAddresses> 
      <add baseAddress="http://localhost:8080/YourService" /> 
     </baseAddresses> 
     </host> 
     <endpoint address="mex" binding="mexHttpBinding" 
       contract="IMetadataExchange" /> 
     ..... (your own other endpoints) ........... 
    </service> 
    </services> 
</system.serviceModel> 

を今、「HttpGetEnabled」からメタデータを取得するために行くためにベースアドレスhttp://localhost.8080/YourServiceを持っています。

それとも、これを好きではない場合は、もう一度、エラーメッセージがあなたの代わりに、非常に明確である:あなたのServiceMetadataにHttpGetUrlの絶対URLを定義します。

<serviceBehaviors> 
    <behavior name="Default"> 
     <serviceMetadata 
      httpGetEnabled="true" 
      httpGetUrl="http://localhost:8282/YourService/mex" /> 
    </behavior> 
    </serviceBehaviors> 

クライアントからメタデータを取得することができますあなたの "mex"エンドポイントは、この2番目の例のように定義された固定URLのいずれかであるか、メタデータのサービスのベースアドレス(存在する場合)に移動します。

IISから来ていて何も調整していない場合は、ベースアドレスもメタデータ交換エンドポイントの明示的で絶対的なURLもないため、表示されているエラーが発生します。

マルク・

+1

私はここで同じ問題を抱えてしまったが、何をすべきか分からなかったためではなかった。むしろ、私は自分の設定に "ベースアドレス"を追加するために何を探すべきか分からなかった。 ''と ' 'プロパティの存在と構文を決定するためにどのようなリソースを使用しましたか? – Matt

0

私はこれは私のエラーの原因である、私は私の場合binding.In net.pipeを使用しようとしたときに、デフォルトのサービス動作は、サービスのメタデータを公開し、このエラーに直面しました。私の解決策は、あなたのサービスに対して異なる振る舞いを使うことです。 、その後、私は@marc_s答えに応じて私の設定ファイルを変更し、次のように異なるサービスの動作を行います。サービスクラスが正しいことを

<serviceBehaviors> 
     <!--Default behavior for all services (in my case net pipe binding)--> 
     <behavior > 

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

      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     <!--for my http services --> 
     <behavior name="MyOtherServiceBehavior"> 

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

      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
0

チェックを。それは私の問題

// Create a ServiceHost for the CalculatorService type and 
// provide the base address. 
serviceHost = new ServiceHost(typeof(ServiceClass)); 
関連する問題