2012-03-24 4 views
0

MiniCalcという2つの操作しかない基本的な電卓サービスを作成しました。 AddとMulを実行し、コンソールアプリケーションでそれをホストしました。"Add Service Reference"で自己ホストサービスのプロキシを生成できません

using(ServiceHost host = new ServiceHost(typeof(MiniCalcService.Service), 
             new Uri("http://localhost:8091/MiniCalcService"))) 
{ 
    host.AddServiceEndpoint(typeof(MiniCalcService.IService), 
          new BasicHttpBinding(), 
          "Service"); 
    host.Open(); 
    Console.Write("Press ENTER key to terminate the MiniCalcHost . . . "); 
} 

は、それからサービスを消費するコンソールアプリケーションを作成し、プロキシクラスを作成することにより、手動でプロキシを作成し、サービスを呼び出すためのChannelFactoryを作成しました。

EndpointAddress ep = new EndpointAddress("http://localhost:8091/MiniCalcService/Service"); 
IService proxy = ChannelFactory<IService>.CreateChannel(new BasicHttpBinding(),ep); 

私は適切にサービス契約を起動し、期待通りの結果を取得することができました。

今、Add Service Referenceを使用してプロキシを作成しました。

私は私が何をしないか、間違ってやっているサービス参照の追加]ウィンドウ

There was an error downloading 'http://localhost:8091/MiniCalcService/Service'. 
The request failed with HTTP status 400: Bad Request. 
Metadata contains a reference that cannot be resolved: 'http://localhost:8091/MiniCalcService/Service'. 
Content Type application/soap+xml; charset=utf-8 was not supported by service http://localhost:8091/MiniCalcService/Service. The client and service bindings may be mismatched. 
The remote server returned an error: (415) Cannot process the message because the content type 'application/soap+xml; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'.. 
If the service is defined in the current solution, try building the solution and adding the service reference again. 

でGo]をクリックしたときに、私は次のエラーを取得しますか?

+0

ブラウザで.SVCにアクセスすると、それはいくつかの使用方法の例や、あなたのサービスがそれについての情報を提供しないことについて何かを示して? –

+0

.svcファイルはありません。私はService.csとそれに対応するIService.csを作成しました。私の無知を気にしないでください。ただし、.svcファイルが必要です。プロキシを生成してサービスを使用するツールを使用する必要がありますか? – Animesh

+0

尋ねたことがない場合は、無知です。誰もが何も知らない。ある時点ではゼロから始める必要があります。私の答えを見てください。 –

答えて

3

ServiceHostでメタデータ交換の動作を有効にします。

using(ServiceHost host = new ServiceHost(typeof(MiniCalcService.Service), 
          new Uri("http://localhost:8091/MiniCalcService"))) 
{ 
    host.AddServiceEndpoint(typeof(MiniCalcService.IService), 
          new BasicHttpBinding(), 
          "Service"); 

    //Enable metadata exchange 
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 
    smb.HttpGetEnabled = true; 
    host.Description.Behaviors.Add(smb); 

    host.Open(); 
    Console.Write("Press ENTER key to terminate the MiniCalcHost . . . "); 
} 

http://wcftutorial.net/WCF-Self-Hosting.aspx

+0

minminメタデータ交換を有効にするために上記の行を追加しましたが、サービス参照の追加を試みるときに同じエラーが表示されます。 – Animesh

+0

minmin、あなたの答えは私のために働いた。私の間違いは、エンドポイントとアドレスが同じであると考えることでした。したがって、URL:http:// localhost:8091/MiniCalcService/Service'はエンドポイントであり、私のポストとURLに記述されている手動プロキシで使用する必要があります: 'http:// localhost:8091/MiniCalcService'はアドレス参照の追加ウィンドウで使用する必要があります。 – Animesh

1

あなたは私があなたのサービスの.configでこれを持っている必要があります考えて.SVC持っていないので:あなたは、サービスのメタデータを許可するオプションが必要その後

<serviceHostingEnvironment multipleSiteBindingsEnabled="true"> 
     <serviceActivations> 
      <add relativeAddress="Service.svc" service="MiniCalcService.Service" /> 
     </serviceActivations> 
    </serviceHostingEnvironment> 

を:

<serviceMetadata httpGetEnabled="true" /> 

これはもう少し複雑なので、新しいWCF Sを作成することをお勧めします新しいソリューションでは、この設定がどのように見えるかを見ることができます。したがって、コピー/ペーストの設定を行うだけで済みます。そのポイントの後

http://localhost:8091/MiniCalcService/Service.svc

+0

Vitor、これは設定の代わりに上記のコードを達成することは可能ですか?私はまだapp.configファイルを持っていないので、これを尋ねます。 – Animesh

+0

ファイル - >追加 - >アプリケーション構成ファイルを指し示すapp.configを簡単に追加できます。あなたが@minminのようなaproachでこれを達成することができると思う設定をしたくない場合は書きました。 –

+0

私はminminのコードを使って欲しいものを達成しました。私は彼の答えの下で説明を掲示した。ご協力いただきありがとうございます。 – Animesh