WCF - próba pobrania messageid z ws addressing

WCF - próba pobrania messageid z ws addressing
R9
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 4 lata
  • Postów:87
0

Witam,
Mam takie zadanie do wykonania : "Wymagane jest określenie po otrzymaniu odpowiedzi z usługi, której wiadomości dotyczyła dana odpowiedź (odczytanie MessageId z WS-Addressing)"

Mam stworzony serwis(prosty kalkulator) , z którym komunikuję się za pomocą klienta(aplikacja konsolowa).
Za pomocą narzędzia 'wcftestklient' podejrzałem jak wygląda request i response . Spostrzegłem , że messageId jest jedynie wysyłane w request , a w response nie ma już o tym mowy, więc jak mam pobrać w kliencie messageId wiadomości która właśnie dotarła. hm ?

wrzucam SOAP dla request:

Kopiuj
<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">
  <s:Header>
    <a:Action s:mustUnderstand="1">http://tempuri.org/IMathService/Calculate</a:Action>
    <a:MessageID>urn:uuid:1a63fcea-b0a4-436c-b8b2-4f010a9ee7ba</a:MessageID>
    <a:ReplyTo>
      <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
    </a:ReplyTo>
  </s:Header>
  <s:Body>
    <Calculate xmlns="http://tempuri.org/">
      <a>2</a>
      <b>3</b>
      <typDzialania>43</typDzialania>
    </Calculate>
  </s:Body>
</s:Envelope>

oraz response:

Kopiuj
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <s:Header>
    <a:Action s:mustUnderstand="1" u:Id="_2">http://tempuri.org/IMathService/CalculateResponse</a:Action>
    <a:RelatesTo u:Id="_3">urn:uuid:945f51ed-bff8-45cd-a86e-dc5c83f016fc</a:RelatesTo>
    <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <u:Timestamp u:Id="uuid-4af22a12-abf8-4222-89a7-c563be3c8bdd-11">
        <u:Created>2012-10-21T20:31:11.231Z</u:Created>
        <u:Expires>2012-10-21T20:36:11.231Z</u:Expires>
      </u:Timestamp>
      <c:DerivedKeyToken u:Id="uuid-4af22a12-abf8-4222-89a7-c563be3c8bdd-7" xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc">
        <o:SecurityTokenReference>
          <o:Reference URI="urn:uuid:1f9474ab-2b57-4eb4-8000-d2fbe2cbe80c" ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct" />
        </o:SecurityTokenReference>
        <c:Offset>0</c:Offset>
        <c:Length>24</c:Length>
        <c:Nonce>5IXVXAQakyw7rxMhjGfoyQ==</c:Nonce>
      </c:DerivedKeyToken>
      <c:DerivedKeyToken u:Id="uuid-4af22a12-abf8-4222-89a7-c563be3c8bdd-8" xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc">
        <o:SecurityTokenReference>
          <o:Reference URI="urn:uuid:1f9474ab-2b57-4eb4-8000-d2fbe2cbe80c" ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct" />
        </o:SecurityTokenReference>
        <c:Nonce>pYXsbaCzkYyB12VA22okuA==</c:Nonce>
      </c:DerivedKeyToken>
      <e:ReferenceList xmlns:e="http://www.w3.org/2001/04/xmlenc#">
        <e:DataReference URI="#_1" />
        <e:DataReference URI="#_4" />
      </e:ReferenceList>
      <e:EncryptedData Id="_4" Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns:e="http://www.w3.org/2001/04/xmlenc#">
        <e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />
        <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
          <o:SecurityTokenReference>
            <o:Reference ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/dk" URI="#uuid-4af22a12-abf8-4222-89a7-c563be3c8bdd-8" />
          </o:SecurityTokenReference>
        </KeyInfo>
        <e:CipherData>
          <e:CipherValue>tu był jakis dlugi ciag znakow -ktory usunalem - pewnie nie jest istotny, a zajmowal duzo miejsca</e:CipherValue>
        </e:CipherData>
      </e:EncryptedData>
    </o:Security>
  </s:Header>
  <s:Body u:Id="_0">
    <CalculateResponse xmlns="http://tempuri.org/">
      <CalculateResult xmlns:a="http://schemas.datacontract.org/2004/07/MathServiceProject.Messages" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:DataRozpoczecia>2012-10-21T22:31:11.2319433+02:00</a:DataRozpoczecia>
        <a:DataZakonczenia>2012-10-21T22:31:11.2319433+02:00</a:DataZakonczenia>
        <a:Liczba1>2</a:Liczba1>
        <a:Liczba2>3</a:Liczba2>
        <a:Typ>43</a:Typ>
        <a:Wynik>5</a:Wynik>
        <a:idIncoming xmlns:b="http://schemas.datacontract.org/2004/07/System.Xml" />
        <a:idOutgoing i:nil="true" xmlns:b="http://schemas.datacontract.org/2004/07/System.Xml" />
      </CalculateResult>
    </CalculateResponse>
  </s:Body>
</s:Envelope>

W skrócie chodzi oto, że klient wysyła do usługi wiadomości , ale z usługi do klienta wracają w różnych odległościach czasowych no i właśnie po to jest te odczytywanie messageId , żeby wiedzieć do którego request-a jest dany response.
Wiecie jak rozwiązać ten problem?


nigdy nie wiesz gdzie czai się sztruks...
R9
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 4 lata
  • Postów:87
0

W XML'u z response jest jakieś ID, ale nijak ma się do tego messageID z request'a:

Kopiuj
<a:RelatesTo u:Id="_3">urn:uuid:945f51ed-bff8-45cd-a86e-dc5c83f016fc</a:RelatesTo>

hm, nikt nie wie oco b?


nigdy nie wiesz gdzie czai się sztruks...
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:3 minuty
0

hm, nikt nie wie oco b?
Ja myślę, że mało kto zagłębia się w wewnętrzny format przesyłanych komunikatów…

R9
Hm , więc jak rozpoznać którego wywołania dotyczy dana odpowiedź (jeżeli odpowiedzi z usługi przychodzą 'jak chcą' tzn - niekoniecznie w takiej samej kolejności jak requesty ) ?
Azarien
Nie wiem. I obawiam się, że mało kto będzie wiedział, „oco b”.
R9
Kto zajmuje się SOA 'trochę więcej' na pewno wie "oco b" ;] , w sumie w request po coś jest te messageID i można je wykorzystać , pytanie tylko jak ;)
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
0

Nie możesz sobie do CalculateResult dodać właściwości i przez nią zwrócić to messageId?

R9
chodzi Ci oto , że wysyłałbym sam messageID do usługi a następnie razem z odpowiedzią zwracał te moje messageID ? Nie taki sposób nie może być , mam konkretnie powiedziane , że messageID muszę odczytać z WS-addressing
MN
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 10 lat
0

MessageID powinno być takie same jak RelatesTo w odpowiedzi. Z tym, że Ty masz tam dodatkowo zastosowane szyfrowanie, więc nie wiem czy to nie ma jakiegoś znaczenia.

edytowany 1x, ostatnio: marcin.NET
R9
tak też myślałem , że to jest jakieś szyfrowanie, tylko jakie i jak zrobić żeby to porównać. Jeżeli to ma znaczenie to jako binding mam ustawiony: wsHttpBinding
R9
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 4 lata
  • Postów:87
0

Mam jeszcze 3 podpunkty z którymi na razie nie bardzo wiem jak sobie poradzić , może Wy się spotkaliście z czymś takim ?

-Możliwość określenia w ReplayTo, że odpowiedź ma zostać wysłana na wskazany przez klienta adres e-mail (format w replayTo - mailto:address[at]example.com)
-Jeśli klient nie jest zainteresowany odpowiedzią (".../none") operacja nie powinna zostać wykonana
-Brak oczekiwania klienta usługi na odpowiedź w przypadku, gdy nie jest odbiorcą (odbiorca róźny od ".../anonymous")

Dodatkowe pytanie: Wie ktoś jak dobrać się do messageId po stronie klienta jeszcze przed wysłaniem requesta ? Pewnie jest jakaś klasa która to udostępnia...


nigdy nie wiesz gdzie czai się sztruks...
edytowany 3x, ostatnio: rahim99

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.