2009-08-14 14 views
8

Napisałem prostą usługę WWW WCF, która jest skonfigurowana programowo. naraża on trzy punkty końcowe, które wiążą różne wiązania do tego samego zamówienia:Konwersja programowej konfiguracji usługi WCF na plik konfiguracyjny

  • WebHttpBinding
  • WebHttpRelayBinding (ponad Microsoft Azure)
  • myBinding (self-made wiążące w dodatkowym DLL)

kod konfiguracji jest w tej chwili dość prosty:

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(); 

Teraz Chcę wyeksportować tę konfigurację do pliku konfiguracyjnego, ponieważ chcę ją zmienić bez konieczności ponownej kompilacji.

Moje pytania w tej chwili są:

  • Gdzie mogę znaleźć cenne informacje, aby osiągnąć swój cel? Większość witryn mówi tylko o powiązaniach SOAP - bez słowa o tym, jak dołączyć niestandardowe powiązanie.
  • Czy muszę zmienić MyBinding, aby zaakceptować konfigurację za pomocą app.config, czy też ServiceModel nazywa to dokładnie tak, jak robi to moje programistyczne podejście, gdy konfiguracja jest w porządku?

Odpowiedz

11

OK, więc najważniejsze rzeczy to:

  • adres
  • wiążące
  • kontrakt

a następnie kilka dodatkowych rzeczy wyrzucane w

1). Adres:

Get to stąd:

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

i tutaj:

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

trzeba więc coś takiego:

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

w swojej służbie.

2) Oprawa:

Pierwszym punktem końcowym jest webHttpBinding, drugi wykorzystuje wiążące zamówienie ("MyBinding") - więc trzeba:

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

i trzeba zdefiniować Twój wiążący zwyczaj:

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

lub utwórz <extensions> punkt dla swojej wiązaniami przechowywane w kodzie w oddzielnym zespole.

3) Zamówienia

nie wyraźnie zobaczyć umowę w dowolnym miejscu - zawsze tylko użyć typeof (MyService), ale zazwyczaj jest to usługa betonowej instancja, nie usługa kontrakt który powinien być interfejsem (coś takiego jak IMyService). Dlaczego nie masz wyraźnej umowy serwisowej? (! Nie najlepszej praktyki, ale jest to możliwe)

W każdym razie, jeżeli realizacja usług jest umowa, również w tym samym czasie, to masz swoje dwa punkty końcowe tak:

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

Następnie należy dodać tu i tam kilka kropi (określenie „adres bazowy” usługi, serwis dać nazwę i tak dalej), i powinien skończyć z czymś takim:

<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> 

teraz tracisz jest zachowanie zdefiniowane - zostawię to jako ćwiczenie dla plakatu :-)

Czy to coś pomoże?

Co do referencji - hmmm ..... trudno powiedzieć .... chyba zwykłe książki ("Learning WCF" autorstwa MLBustamante dla początkujących/średniozaawansowanych, "Programowanie WCF" przez Juval Lowy dla średnio zaawansowanych/zaawansowanych) to mój najlepszy zakład i naprawdę dużo doświadczenia. Nie znam żadnego źródła, które jednoznacznie pokazuje i uczy, jak konwertować ustawienia w kodzie i konfiguracji - dwie wspomniane książki zwykle pokazują obie strony, i od tego możesz sam to zrozumieć.

Marc

+0

Dzięki za wyjaśnienie procesu budowania pliku konfiguracyjnego. Zgodnie z oczekiwaniami, wdrożenie usługi jest również umową. Wybrałem to, ponieważ kontrakt składa się z dwóch bardzo ogólnych funkcji i nie nadaje się do ponownego użycia. Próbowałem najpierw za pomocą webHttpBinding i skomentowałem istniejącą programową konfigurację. Jednak to nie działa. Usługa nie jest dostępna po otwarciu http: // localhost w mojej przeglądarce internetowej. Czy muszę wprowadzić inne ustawienia aplikacji w VS? (W tej chwili jest to standardowa "aplikacja konsolowa"). – Etan

+0

Jednym z problemów jest: dla wiązania webHttp potrzebujesz WebServiceHost - dla pozostałych wiązań potrzebujesz prostego ServiceHost - więc prawdopodobnie nie będziesz możliwość hostowania wszystkich punktów końcowych w jednym (Web) ServiceHost –

1

prolem z plikiem konfiguracyjnym nie jest prawidłowo rozpoznany może zostać rozwiązany.

prostu musiałem dodać

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

do mojego kodu, myślałem, że ServiceModel automatycznie uruchomić usługę, ponieważ zna wszystkie informacje. To jest trochę dziwne, że dodajesz informacje o "MyService" do pliku konfiguracyjnego, a potem również musisz je podać w kodzie.

Jednak prawdziwa odpowiedź na mój problem została podana przez marc_s, który bardzo dobrze opisał cały proces konwersji z podejścia programowego do pliku konfiguracyjnego.

Powiązane problemy