2010-10-13 4 views
4

J'ai un HttpHandler qui interroge 3 services Web dans une seule requête et stocke les résultats dans un seul cookie.Synchronisation sur le service Web et les appels du navigateur

Comme vous pouvez l'imaginer, les résultats entrent en collision. Voici comment:

Le processus est comme suit: lorsque j'interroge le service 1 et attend le résultat, le cookie im stocker les résultats n'existe pas encore, alors le résultat vient du service 2 et volia, crée le cookie, stocke le Résultat, puis la réponse revient du service 1 et écrase ce cookie, ce qui ne devrait pas être le cas. Ce que je veux, c'est mettre ces demandes en file d'attente.

Dois-je le faire du côté client via javascript? si oui, comment? :)

ou le faire du côté serveur? Donc je ne veux pas d'appels asynchrones. droite?

Voici le code:

if(service1.isEnabled){ 
    invokeService1(); 
} 

if(service2.isEnabled){ 
    invokeService2(); 
} 

if(service3.isEnabled){ 
    invokeService3(); 
} 

invokeService1(){ 
    callToService1(); 
    // response comes to another HttpHandler, which is a redirect from the service  
} 

invokeService2(){ 
    callToService2(); 
    // response comes to another HttpHandler, which is a redirect from the service 
} 

invokeService3(){ 
    callToService3(); 
    // response comes to another HttpHandler, which is a redirect from the service 
} 

lorsque les réponses arrivent au HttpHandler, il est livré avec querystring.

alors sur cette HttpHandler:

HttpCookie cookie = request.Cookie.Get(MYCookie) ?? new HttpCookie(MYCookie); 

if(request.Params["foo"]){ 
    //set cookie content 
} 

if(request.Params["Bar"].isNotNullOrEmpty()){ 
//set cookie content 
} 

c'est ainsi que je l'ai mis. La façon dont je crée le cookie est un problème je pense.

+0

Donc, si je vous comprends bien: votre site appelle la 'HttpHandler'. Ce HttpHandler appelle les trois services Web, puis renvoie un cookie au navigateur Web appelant, corriger? Pouvons-nous voir s'il vous plaît le code de la façon dont le gestionnaire appelle actuellement les services Web, et comment le cookie est défini? – SamStephens

+0

a édité la question, et a ajouté du code. – DarthVader

Répondre

0

Pouvez-vous sérialiser les demandes et faire en sorte que le client les émette indirectement?

pour par exemple:

première demande du client

 
GET /handler.ashx HTTP/1.1 
.... 

serveur recorgnizes qu'il n'y a pas de cookie dans la demande. Donc, il suppose que c'est une nouvelle connexion. Réponse du serveur avec une redirection:

 
HTTP/1.1 302 Moved 
Location: http://server.com/handler.ashx?executeService1 

Deuxième demande du client

Maintenant, le client envoie une requête à handler.ashx executeService1

Le gestionnaire reçoit cette demande et les requêtes WebService1?. Et met un cookie dans la réponse (avec une autre redirection)

 
HTTP/1.1 302 Moved 
Location: http://server.com/handler.ashx?executeService2 
set-cookie: value 

Vous avez l'idée?

L'avantage est que le serveur est en négociation avec le client. SEver sait combien de fois les services Web doivent être appelés et peut utiliser le cookie pour le faire.

Une autre option comme vous avez suggéré est de faire du côté client en utilisant javascript et AJAX avec une charge utile XML. Lorsque les appels de service Web sont terminés, vous pouvez appeler le serveur avec le résultat des appels de service et le serveur peut définir un cookie sur le client.

1

Non, tout devient beaucoup plus simple si vous comptez sur les appels asynchrones, donc vous devez fournir des fonctions de rappel à votre invokeService et callService méthodes, puis continuer l'exécution du rappel.

Essayez ceci:

var cookieData = {}; 

var callService = function(service, onCalledService) { 
    // TODO #1: contact the server to get the cookie data 
    // on server callback: 
    //  TODO #2: append the retrieved data to cookieData 
    //  and still inside the server callback do: onCalledService();  
}; 

var invokeService = function(service, onInvokedService) { 
    if (service.isEnabled) { 
     callService(service, function() { 
      onInvokedService(); 
     }); 
    } else { 
     onInvokedService(); 
    } 
}; 

invokeService(service1, function() { 

    invokeService(service2, function() { 

     invokeService(service3, function() { 
      // cookieData now has all the data you need, so: 
      // TODO #3: set the cookie content 
     }); 

    }); 

}); 

Voici ce qui devrait se produire:

1. invokeService(service1, ...) will check if service1 is enabled 
1.1. if service1 is enabled 
1.1.1. callService(service1, ...) 
1.1.2. append the retrieved data to cookieData 
1.1.3. call the callback (i.e. go to 2.) 
1.2. if service1 is not enabled 
1.2.1. call the callback (i.e. go to 2.) 

2. invokeService(service2, ...) will check if service2 is enabled 
2.1. if service2 is enabled 
2.1.1. callService(service2, ...) 
2.1.2. append the retrieved data to cookieData 
2.1.3. call the callback (i.e. go to 3.) 
2.2. if service2 is not enabled 
2.2.1. call the callback (i.e. go to 3.) 

3. invokeService(service3, ...) will check if service3 is enabled 
3.1. if service3 is enabled 
3.1.1. callService(service3, ...) 
3.1.2. append the retrieved data to cookieData 
3.1.3. call the callback (i.e. go to 4.) 
3.2. if service3 is not enabled 
3.2.1. call the callback (i.e. go to 4.) 

4. set the cookie content 
+0

les appels sont faits à partir du code côté serveur pas d'un javascript. – DarthVader

Questions connexes