Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[.NET SOA] Webservice call async en geen response

Pagina: 1
Acties:

Verwijderd

Topicstarter
Vreemd probleem met een async-call in SOA architectuur: We hebben een probleem met een webservice die 'wacht' tot een async call klaar is. De vraag is of we kunnen voorkomen dat er op de response van de async-call gewacht wordt.

Het zit als volgt in elkaar:

We hebben een webservice A gebouwd. Die wordt door derden bevraagd. Deze A doet een call naar een (externe) webservice E.

Onze webservice A krijgt dan een flinke hoeveelheid items van E.

Vervolgens kun je van webservice E ook de 'detailinformatie' van elk item opvragen. Dit duurt erg lang, en wij willen dat onze webservice A 'snel' een compleet antwoord kan geven. Dus we zorgen dat we de detailinformatie zelf in een databasecache plaatsen zodat we zelf de detailinformatie aan elk item hangen als A bevraagd wordt en niet steeds op E hoeven te wachten.

Alleen als er nu tijdens een antwoord van E nieuwe items zijn, dan gaan we voor die items de detailinformatie ophalen en in onze dbcache stoppen. Dit ophalen van van de detailinformatie laten we doen door webservice B.

De opzet is dan als volgt:

A doet een call naar E.
E antwoord met (bijvoorbeeld) 100 items. Stel dat 2 hiervan onbekend zijn voor A.
A doet dan een async-call naar B om voor die 2 detailinformatie bij E op te halen en onze cache te updaten.
Het doel is dat A snel een response kan geven. A hoeft wat ons betreft niet te wachten tot B klaar is met het bevragen van E. Vandaar de async-call.
A moet voor alle 100 items een response geven, zo snel mogelijk. We weten dat voor 2 items de detailinformatie er nog niet is, of outdated is, maar dat vinden we niet zo belangrijk.

Maar: dit laatste lukt nu net niet! Want webservice A blijft wachten tot er antwoord van B komt.

Hoe voorkomen we dat webservice A blijft wachten op antwoord van B?

Onze .net code om B async te bevragen

C#:
1
2
3
4
cacheProxy.Url = WebConfigurationManager.AppSettings["CacheConnectionUrl"]; 
ItemCacheRequest cacheRequest = new ItemCacheRequest();
cacheRequest.ItemKeys = toCacheItems.itemKeys; 
cacheProxy.CacheItemsAsync(cacheRequest);:


De method 'CacheItems' is een door .NET gegenereerde webmethod van webservice B (de cache-webservice). De method 'CacheItemsAsync' is ook door .NET gegenereerd.

We hadden eerst ook staan:

C#:
1
cacheProxy.CacheItemsCompleted += new CacheItemsCompletedEventHandler(resultLogger.AsyncCompleted);


Om het resultaat van webservice B naar onze log te schrijven, maar zelfs als we niet koppelen aan dat event, blijft onze webservice A wachten tot de call naar B klaar is.

Iemand enig idee hoe te zorgen dat A niet wacht op antwoord van B voordat die zelf het antwoord gaat versturen?

Verwijderd

Topicstarter
Kan me voorstellen dat niemand reageerde, Het probleem had eigenlijk een plaatje nodig om het goed te kunnen schetsen :)
Maar voor degenen die het willen weten: De oplossing was uiteindelijk om de WebMethod van Webservice B als een 'fire-and-forget' webmethod te markeren.

Dit kan met een attribuut boven de webmethod.

In code ziet dat er dan als volgt uit in webservice B:
code:
1
2
3
[SoapDocumentMethod(OneWay = true)]
[WebMethod]
public void SomeWebMethod(MyParameterClass myParameter)


Dan krijgt webservice A zo snel mogelijk een reactie van webservice B, en kan dus doorgaan met z'n eigen proces.