2009-12-06 12 views
15

Próbuję lepiej zrozumieć proces ekspedycji WCF, w szczególności wpływ i wpływ na różne punkty rozszerzalności. Ze stron internetowych wymienionych na dole wynika, że ​​WCF wykona następujące czynności w podanej kolejności, gdy wiadomość zostanie przekazana do dyspozytora przez stos kanałów.Co to jest przepływ komunikatu potoku WCF

  1. Wiadomość Inspektor
  2. Selector Operacja
  3. Formatowanie
  4. Parametr Inspektor
  5. Operation Invoker wiadomość.

Próbuję znaleźć opcje rozwiązania problemu, który mam, i jednym ze sposobów, w jaki myślę, jest użycie kombinacji Inspektora wiadomości, selektora operacji, formatowania komunikatu i wywołania operacji. Niestety, moja obserwacja wydaje się wskazywać kolejność wykonywania jest następujący zamiast:

  1. Operation Selector
  2. Wiadomość Inspektor
  3. Operacja Invoker (AllocateInputs())
  4. Wiadomość formatowania
  5. Inspektor parametrów
  6. Opera cja Invoker (Invoke())

mogę zrozumieć niewielką różnicę gdzie A AllocateInputs zwyczaj Invoker() metoda jest wywoływana przed formatowania wiadomości jako sekcji Wiadomość Formatowanie jest zasadniczo deserialising daną wiadomość do zestawu argumentów metoda należy przekazać do odpowiedniej operacji, a metoda AllocateInputs() wywołującego określa liczbę oczekiwanych parametrów.

Część, która mnie wyrzuca, jest odwróceniem sekwencji między Inspektorem komunikatów a selektorem operacji. Wydaje mi się logiczne, że Inspektorzy komunikatów są uruchamiani jako pierwsi podczas działania wiadomości, podczas gdy Selektor operacji określa, w której usłudze jest kierowana wiadomość.

Pytania:

  • Czy to z powodu różnych wersji lub wersjach WCF?
  • Czy to dlatego, że WCF faktycznie nie określa sekwencji wykonania rozszerzalności punktów?

strona referencyjne:
Extending WCF to support custom data formats - weblog zulfikar za
Extending WCF with Custom Behaviours - MSDN Obsługa stacji grudnia 2007
Message Flow Interception Points - Nicholas Allen Indigo Blog

Uwaga: moje przeprosiny za nie umieszcza odnośniki, mogą” t ma więcej niż jeden, ponieważ wciąż jestem noobem.=)

+1

Tam głosowałem za twoją historią. Możesz być w stanie opublikować więcej niż jeden link, ponieważ masz 11 powtórzeń ... może: P –

+2

Dodałem linki dla ciebie, @hg. – bobbymcr

+0

Ah ... Nie wiedziałem, że ma to związek z przedstawicielem. Wielkie dzięki, @Crowe. Dzięki @bobbymcr za umieszczenie linków. Czy byłoby zbyt wiele nadziei na jakieś odpowiedzi? =) –

Odpowiedz

5

Aby określić faktyczną kolejność wykonywania kodu, zaleca się włączenie śledzenia dla WCF i przejrzenie generowanych dzienników śledzenia. To może być włączony przez dodanie tego do pliku konfiguracyjnego:

<configuration> 
    <system.diagnostics> 
     <sources> 
      <source name="System.ServiceModel" 
        switchValue="Information, ActivityTracing" 
        propagateActivity="true"> 
       <listeners> 
        <add name="traceListener" 
         type="System.Diagnostics.XmlWriterTraceListener" 
         initializeData= "c:\log\Traces.svclog" /> 
       </listeners> 
      </source> 
     </sources> 
    </system.diagnostics> 
</configuration> 

ile punktów rozciągliwość WCF, Carlos Figueira (jeden z inżynierów WCF w firmie Microsoft) ma posta szczegółowo prawie wszystkie punkty rozciągliwości w WCF (http://blogs.msdn.com/b/carlosfigueira/archive/2011/03/14/wcf-extensibility.aspx).

W sekcji WCF Runtime tego postu kolejność jest wymieniony jako takie:

1.2. WCF Runtime 
    1.2.1. Message interception 
     1.2.1.1. I[Client/Dispatch]MessageInspector 
     1.2.1.2. IParameterInspector 
    1.2.2. Mapping between message and operation parameter 
     1.2.2.1. I[Client/Dispatch]MessageFormatter 
    1.2.3. Mapping between message and CLR operations 
     1.2.3.1. I[Client/Dispatch]OperationSelector 
     1.2.3.2. IOperationInvoker 
    1.2.4. Instance creation 
     1.2.4.1. IInstanceProvider 
     1.2.4.2. IInstanceContextProvider 
    1.2.5. Error handling 
     1.2.5.1. IErrorHandler 
    1.2.6. Others 
     1.2.6.1. ICallContextInitializer 
     1.2.6.2. IChannelInitializer 
     1.2.6.3. IInteractiveChannelInitializer 

myślę między nimi kolejność operacji w WCF powinny stać się jasne.