2009-04-29 4 views
0

Ich habe eine .asmx Web-Service-Webmethode, die ich erfolgreich von jquery.ajax aufrufen. Die Webmethode funktioniert ordnungsgemäß. Es funktioniert jedoch sehr langsam.ASP.NET-Webdienst WebMethod

Die Methode selbst arbeitet gerade sehr wenig. Ich habe CacheDuration = 120 hinzugefügt. Das hat nicht geholfen. Meine wirkliche Sorge ist, wie lange es dauert, die Methode tatsächlich aufzurufen. Wenn die Website lokal ausgeführt wird und der VS2008-Debugger mit einem Haltepunkt in der ersten Zeile der Webmethode gestartet wird, dauert es fast 5 Sekunden, um sogar zur ersten Zeile zu gelangen. Wenn Sie im Debugger auf Weiter klicken, erfolgt die Antwort sofort. Die Webmethode scheint also nicht das langsame "Ding" zu sein.

Hat jemand ähnliches Verhalten erlebt? Muss ich etwas einstellen, damit der Webservice schneller aufgerufen wird?

Code:

[WebService(Namespace = "http://intranet/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ToolboxItem(false)] 
[System.Web.Script.Services.ScriptService] 
public class DocumentService : System.Web.Services.WebService 
{ 

    [System.Web.Script.Services.ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    [System.Web.Services.WebMethod(EnableSession = true, CacheDuration = 120)] 
    public Tree[] GetDocumentTree(string root) 
    {........ 
+0

Die ersten 5 Sekunden ist wahrscheinlich die App neu kompilieren? Gibt es ein Netzwerk zwischen den Anwendungen, das die Dinge verlangsamt? – u07ch

+0

Ist es im Debug-Modus nur langsam? Wenn dies der Fall ist, ist es wahrscheinlich ein Problem, bei dem viele Symboldateien geladen werden müssen, um den Code zu durchlaufen. – jellomonkey

Antwort

0

Sie können mit Fiddler oder FireBug um herauszufinden, was der langsame Teil. Stellen Sie sicher, dass Sie den Webservice einmal getroffen haben, um ihn vor dem Timing zu kompilieren.

+0

Danke für den Vorschlag. Ich benutze Fiddler, um es zu synchronisieren. Ich habe es zeitlich festgelegt, indem ich den Service direkt angeklickt habe und meine Seite getroffen habe. Es ist die gleiche Zeit ... im Debug- oder Release-Modus. Und ich habe es auch kompilieren lassen. Irgendwelche anderen Gedanken? –

0

Verwenden Sie JetBrains dotTrace auch auf der Serverseite. Sobald ich dies getan habe, und festgestellt, dass eine bestimmte .asmx-Seite dauerte lange zu laden, weil Variablen in seinen Konstruktoren initialisiert werden. (Webservice-Referenzen benötigen besonders viel Zeit.)

1

Stellen Sie sicher, dass Ihr Problem nicht nur JIT- oder Ladezeit ist. Beim ersten Aufruf muss der Webservice Baugruppen zusammenstellen und laden, die teuer sein können. Wenn das Problem bei späteren Anrufen weiterhin besteht, überprüfen Sie Ihre Proxy-Einstellungen.

Wir hatten das gleiche Problem. Unsere Verzögerung war viel bedeutender als deine (2 Minuten pro Anruf insgesamt). Wir haben einen Webdienst innerhalb eines Windows-Dienstes aufgerufen, der als Domänenbenutzer ausgeführt wurde. In diesem Benutzerkonto sind anscheinend die Proxy-Einstellungen aktiviert. Für jede HttpRequest-Anforderung an den lokalen Webdienst hat die Sicherung ServicePoint versucht, die Datei wpad.dat von einem nicht vorhandenen Proxyserver abzurufen. Dieser Anruf dauerte 20 Sekunden bis zur Auszeit. Schlimmer noch, es gibt eine globale Sperre für den Code, der den Proxy in den .net-Bibliotheken abruft. Auf diese Weise stapeln sich die Anrufe auf das Timeout des Internets. Der Dienst, der die Anrufe ausführt, ist unser Warteschlangenprozess, der all unser asynchrones Verhalten abwickelt. Also das gesamte System gesichert.

Wenn Sie den Code sehen möchten, schauen Sie in Reflector System.Net.AutoWebProxyScriptEngine.GetProxies.

Da ich in Frage zu dem Benutzerkonto keine Rechte haben feste ich heute unser Problem durch auf die app.config-Datei hinzufügen.

Wenn Ihre Methode mit Ajax aufgerufen werden soll, müssen Sie die Browsereinstellungen korrigieren. Deaktivieren Sie die Option Einstellungen automatisch erkennen in den Connections \ Lan-Einstellungen. Ich habe mich ein bisschen im Internet umgeschaut, nachdem ich das Problem gefunden hatte, und es wird berichtet, dass IE7 Latenzprobleme hat, wenn diese Einstellung aktiviert ist. Wenn Sie einen Proxyserver haben, geben Sie die Serveradresse im selben Dialog manuell ein.