2010-12-08 40 views
3

Nous examinons certains problèmes de performances avec un service Web que nous appelons. J'ai réussi à placer le code d'enregistrement du temps dans toutes les méthodes du service web proprement dit, mais maintenant il semble que le temps réel nécessaire pour sérialiser le jeu de résultats pourrait être un problème?Est-il possible d'enregistrer le temps nécessaire pour sérialiser les objets renvoyés par un service Web?

Alors je cherche à enregistrer combien de temps sérialisation ces données prend, mais je suis mal à obtenir des résultats ..

Voici un exemple méthode de service web, nous avons:

[AuthExtension] 
[WebMethod] 
[SoapHeader("AuthHeader", Direction = SoapHeaderDirection.In)] 
public ResultSet CheckAvailability(FareSelections fareSelections) 
{ 
    ResultSet results = null; 
    results = Logic.CheckAvailability(fareSelections, AuthHeader.Token, timeLogger); 
    return results; 
} 

J'ai essayé , en plaçant des méthodes dans la classe renvoyée qui sont décorées avec les attributs [OnSerializing()] et [OnSerialized()], mais cela ne fonctionne pas. J'ai également essayé de capturer les timings dans la méthode en utilisant un bloc try..finally, mais je ne pense pas que ce soit l'enregistrement du temps de sérialisation réel non plus?

Il a été suggéré que je devrais implémenter mon propre sérialiseur (qui enregistrerait simplement les timings et ensuite appeler le sérialiseur par défaut de toute façon), mais je me demandais juste si c'était la seule option que j'ai?

Des pensées très appréciées.

Répondre

2

Vous pouvez utiliser un Custom SoapExtension. Dans la méthode ProcessMessage(), vous pouvez voir 4 événements, la sérialisation avant et après et la désérialisation avant et après. Commencez un chronomètre dans les Befores, terminez-le sur les Afters, puis rangez le temps quelque part. Vous ne pouvez pas utiliser la visionneuse de trace de service pour vérifier combien de temps prend chaque demande?

+0

Cela pourrait être la voie à suivre .. Je vais placer ma classe TimeLogger là-bas et l'appellera quand le message .Stage est BeforeSerialize et encore une fois lorsque le message.Stage est AfterSerialize - merci beaucoup pour cette suggestion –

+0

Bravo, cela nous a permis d'identifier que la sérialisation des résultats prend> 30 secondes pour les grosses recherches ... maintenant pour en trouver une plus efficace façon de sérialiser cette information et de l'obtenir à l'extrémité avant. Merci beaucoup pour la réponse! –

0

chaîne l'appel autour d'un objet Stopwatch

de la mémoire:

Stopwatch sw = Stopwatch.Startnew(); 
    //stuff 
    sw.Stop(); 
    print sw.ElapsedMilliseconds(); 
+0

Je n'ai pas VS ou mon projet en main donc la syntaxe pourrait être fausse mais c'est facile à corriger – Fredou

0

Vous devriez utiliser quelque chose comme Ants profiler (une version eval ferait l'affaire) pour profiler ces méthodes en question ... cela vous donnera un très bon aperçu.