2011-12-15 4 views
2

J'ai une méthode webservice:
temps de réponse webservice augmenté ... comment?

[WebMethod] 
public Response Process() 
{ 
    return RunCode(); 
} 

ExécuterCode() prend 6 secondes pour exécuter mais IIS/navigateur prend plus de 20 secondes pour revenir le XML.

Si je prends ExécuterCode() et le mettre dans un fil, maintenant retourne en 6 secondes:

private _response Response; 
[WebMethod] 
public Response Process() 
{ 
    new Thread(RunProcess).Start() 
    while(_response==null) 
    { 
    Thread.Sleep(100); 
    } 
    return _response; 
} 

private void RunProcess() 
{ 
    _response=RunCode(); 
} 

Ma question est ... ce qui pourrait se produire dans ExécuterCode() pour forcer IIS /ASP.NET pour retarder la réponse? Le code ne prend que 6 secondes pour s'exécuter ... Une sorte de ressource est-elle bloquée et verrouillée si elle n'est pas sur un thread séparé, donc ASP.NET l'attend?

Édition 1: un exemple de réponse a été demandé. Un exemple de la réponse est la suivante:

<PostResponse> 
     <isValidPost>false</isValidPost> 
     <ResponseType>Post_Over_Max</ResponseType> 
     <ResponseDetails>System is currently at max leads allowed</ResponseDetails> 
     <LeadIdentifier>0</LeadIdentifier> 
     <VendorAccountAssigned>0</VendorAccountAssigned> 
     <PendingQCReview>false</PendingQCReview> 
     <Price>0</Price> 
     <RedirectURL/> 
</PostResponse> 

basé hors de cette classe:

public class PostResponse : IPostResponse 
{ 
    public PostResponse() 
    { 
    } 

    public PostResponse(bool isValid, ResponseErrors responseType, string details, long leadIdentifier, 
         long vendorAccountAssigned, bool pendingQCReview, double price, string redirectUrl) 
    { 
     isValidPost = isValid; 
     ResponseType = responseType; 
     ResponseDetails = details; 
     LeadIdentifier = leadIdentifier; 
     VendorAccountAssigned = vendorAccountAssigned; 
     PendingQCReview = pendingQCReview; 
     Price = price; 
     RedirectURL = redirectUrl; 
    } 

    #region IPostResponse Members 

    public bool isValidPost { get; set; } 
    public ResponseErrors ResponseType { get; set; } 
    public string ResponseDetails { get; set; } 
    public long LeadIdentifier { get; set; } 
    public long VendorAccountAssigned { get; set; } 
    public bool PendingQCReview { get; set; } 
    public double Price { get; set; } 
    public string RedirectURL { get; set; } 

    #endregion 
} 
+0

Combien de fois avez-vous le test après avoir effectué une réinitialisation IIS? – Maess

+0

Quelle est la sortie retournée par la méthode? De plus, vous n'avez pas besoin de faire une boucle "occupée". Vous pouvez faire thread.Join() sur le thread que vous avez créé. – Candide

+0

Votre code peut prendre 6 secondes pour s'exécuter, mais combien de travail IIS doit-il faire pour vous renvoyer les résultats et accepter le message de votre part? –

Répondre

0

Le runtime ASP.NET se bloque les discussions de la même session utilisateur si une demande est suspendue.

Why can’t I execute two requests from the same session simultaneously for an ASP.NET application?

+0

La chose à noter est que toute ma méthode Web ne prend que 6 secondes pour être exécutée du début à la fin, indépendamment de plusieurs demandes simultanées ... le délai se produit APRÈS que mon code soit exécuté lors du renvoi de la réponse au navigateur. – Joel

+0

* seulement * prend 6 secondes? – x0n

+0

- x0n: le POST moyen prend environ 500 ms, mais cet exemple duplique la vérification des données en temps réel sur des millions de lignes, effectue des appels de service Web, ainsi que toutes les choses normales (appels de base de données, etc.). Croyez-moi, c'est optimisé ... nous avons utilisé ANTS performance profiler pour trouver des goulots d'étranglement pour optimiser le code. Là où SQL serait trop lent, nous avons intégré mongo pour les données aplaties/mises en cache pour des requêtes plus rapides. – Joel

Questions connexes