2009-08-14 25 views
8

私はプログラム的に構成された単純なWCF Webサービスを作成しました。WCFサービスのプログラム構成を設定ファイルに変換する

  • WebHttpBinding
  • (マイクロソフト紺碧以上)WebHttpRelayBinding
  • myBinding(自作の追加のDLLに結合)

:それは同じ契約に異なるバインディングをバインドする3つのエンドポイントを公開します設定コードは現時点ではかなり簡単です:

WebServiceHost host = new WebServiceHost(
    typeof(MyService), new Uri("http://localhost:80/")); 

host.AddServiceEndpoint(typeof(MyService), new WebHttpBinding(), ""); 

ServiceEndpoint sbEndpoint = host.AddServiceEndpoint(
    typeof(MyService), new WebHttpRelayBinding(), "http://azureURL"); 
TransportClientEndpointBehavior sbBehavior = 
    new TransportClientEndpointBehavior(); 
sbBehavior.CredentialType = TransportClientCredentialType.UserNamePassword; 
sbBehavior.Credentials.UserName.UserName = "azureUserName"; 
sbBehavior.Credentials.UserName.Password = "azurePassword"; 
sbEndpoint.Behaviors.Add(sbBehavior); 

host.AddServiceEndpoint(typeof(MyService), new MyBinding(), "http://someURL"); 

host.Open(); 

今すぐこの設定を再コンパイルせずに変更できるようにするため、この設定をconfigファイルにエクスポートします。この時点で

私の質問は以下のとおりです。私は私の目標を達成するための貴重な情報を見つけることができます

  • ?ほとんどのサイトでは、SOAPバインディングについてしか話していません。非標準バインディングを含める方法については言及していません。
  • app.configを介して設定を受け入れるためにMyBindingを変更する必要がありますか?設定がうまくいけば、私のプログラム的なアプローチのようにServiceModelを呼び出すのですか?

答えて

11

OK、そうで最も重要なものは以下のとおりです。結合

  • アドレス
  • 契約

、その後、いくつかの追加のものがでスロー

1)。アドレス:

ここからこれを取得する:

WebServiceHost host = new WebServiceHost(
    typeof(MyService), new Uri("http://localhost:80/")); 
host.AddServiceEndpoint(typeof(MyService), new WebHttpBinding(), ""); 

、ここで:

ServiceEndpoint sbEndpoint = host.AddServiceEndpoint(
    typeof(MyService), new WebHttpRelayBinding(), "http://azureURL"); 

ので、あなたのようなものが必要です:あなたのサービスで

<endpoint address="" 
<endpoint address="http://azureURL" 
<endpoint address=""http://someURL" 

を。バインディング

2):

最初のエンドポイントwebHttpBindingは、二番目はカスタムバインディング( "MyBinding")を使用している - ので、あなたが持っている:

<endpoint address="" 
      binding="webHttpBinding" 
<endpoint address="http://azureURL" 
      binding="webRelayHttpBinding" 
<endpoint address=""http://someURL" 
      binding="myBinding" 

、あなたが定義する必要がありますカスタムバインディング:

<bindings> 
    <customBinding> 
    <binding name="MyBinding"> 
     .. define the parameters of your binding here 
    </binding> 
    </customBinding> 
</bindings> 

または別のアセンブリ内のコードに保存された結合のための<extensions>セクションを作成します。

3)

をコントラクト私は明らかにどこにでも契約が表示されない - あなたは今までのtypeof(MyServiceで)を使用していますが、通常、これはインスタンス具体的なサービスではなく、サービス契約は、インターフェース(例えばIMyServiceのようなもの)でなければなりません。なぜあなたは明示的なサービス契約をしていませんか?とにかく

、あなたのサービスの実装は、同じ時間(ないのベストプラクティスが、可能!)で、その後、あなたはこのようなあなたの2つのエンドポイント持って、あまりにも、契約の場合:

<endpoint address="" 
      binding="webHttpBinding" 
      contract="MyService" /> 
<endpoint address="http://azureURL" 
      binding="webHttpRelayBinding" 
      contract="MyService" /> 
<endpoint address="http://someURL" 
      binding="myBinding" 
      contract="MyService" /> 

をあなたはその後、追加する必要がありますあなたが不足しているすべてがある

<system.serviceModel> 
    <bindings> 
     <customBinding> 
     <binding name="MyBinding"> 
      .. define the parameters of your binding here 
     </binding> 
     </customBinding> 
    </bindings> 
    <services> 
     <service name="YourNameSpace.MyService"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:80/" /> 
      </baseAddresses> 
     </host> 
     <endpoint address="" 
        binding="webHttpBinding" 
        contract="MyService" /> 
     <endpoint address="http://azureURL" 
        binding="webHttpRelayBinding" 
        contract="MyService" /> 
     <endpoint address="http://someURL" 
        binding="myBinding" 
        contract="MyService" /> 
     </service> 
    </services> 
</system.serviceModel> 

:いくつかのあちこちで振りかける(サービスに名前を付け、その上、サービスの「ベースアドレス」を定義)、およびのようなもので終わる必要があります定義された動作 - 私はポスターの練習としてそれを残します:-)

これは何かを助けますか?

参考までに...難しいとは....私は通常の書籍(MLBustamanteの「Learning WCF」は初心者/中級者向け、「プログラミングWCF」はJuval Lowyの中級/上級者向けです)私の最高の賭けであり、多くの経験、本当に。私は明示的に示し、コードと設定の設定をどのように変換するかを教えているソースは知らない。通常、2つの書籍は両方の方法を示しており、これから自分自身を理解することができる。

マルク・

+0

設定ファイルを作成するプロセスを説明してくれてありがとう。期待どおり、サービスの実装も契約です。契約は2つの非常に一般的な機能から成っており、再利用はできないため、これを選択しました。私は最初にwebHttpBindingを試して、既存のプログラム設定をコメントアウトしました。ただし、動作しません。 Webブラウザでhttp:// localhostを開くと、サービスにアクセスできません。私はVSでアプリケーションのいくつかの他の設定を行う必要がありますか? – Etan

+0

WebHttpバインディングの場合、WebServiceHostが必要です。他のバインディングの場合は、まっすぐなServiceHostが必要です。単一の(Web)ServiceHostですべてのエンドポイントをホストできる –

1

適切に解決することができる認識されていない設定ファイルとprolem。

はちょうど私のコードに

ServiceHost h = new ServiceHost(typeof(MyService)); 
h.Open(); 

を追加する必要がありました、私はそれがすべての情報を知っているので、ServiceModelが自動的にサービスを開始することを考えました。 "MyService"に関する情報を設定ファイルに追加した後、コード内に指定する必要があります。

しかし、私の問題に対する真の答えは、プログラムアプローチから設定ファイルへの変換のすべてのプロセスを非常にうまく説明したmarc_sによって与えられました。

関連する問題