2016-04-21 7 views
0

Ich habe eine WordPress-Webanwendung, die über SOAP mit einem WCF-Dienst kommuniziert.SOAP-Anfragen blockieren andere SOAP-Anfragen

Angenommen, ich greife auf eine lange laufende SOAP-Anfrage zu. In einem anderen Tab greife ich auf eine andere SOAP-Anfrage zu, aber diese läuft kurz. Die kurze Anfrage scheint durch die lange Zeit blockiert zu werden.

Bei SOAP-Anfragen erstelle ich für jede Anfrage einen neuen Client. Ich kenne die Details der Konfiguration des WCF-Diensts nicht, aber ich bin sicher, dass es gleichzeitige Anforderungen verarbeiten kann. Dies liegt daran, dass beim Ausführen von einer anderen Instanz der Webanwendung andere kurze Anforderungen beendet werden, ohne auf die lange laufende in der ersten Instanz der Webanwendung zu warten.

Ich habe mit einer Art von async SOAP-Client untersucht, aber ich habe nichts gefunden, das für mich funktioniert. Da ich so wenig Information darüber finde, denke ich, dass ich derjenige bin, der etwas falsch macht.

Warum blockieren laufende Anforderungen andere Anforderungen?

Antwort

1

Dies hat nicht mit WCF zu tun. Ihre PHP-Sitzungsdatei wird gesperrt, sodass Sie nur eine gleichzeitige Anforderung pro Browser haben können.

Grundsätzlich gibt es zwei Lösungen:

  • den WCF-Aufruf in einem Hintergrund-Thread oder Prozess im Hintergrund auf Ihrem Webserver starten. Auf diese Weise kann das PHP-Skript, das die Browseranfrage bearbeitet, sofort zurückkehren.

  • Ändern Sie den WCF-Dienst so, statt sofort auszuführen, akzeptiert es einen "Start Working" -Aufruf und Sie können für das Ergebnis der Ausführung abrufen.

+0

Haben Sie Vorschläge zum Ausführen von Anrufen auf einem Hintergrundthread? Irgendwelche Ressourcen, die mir helfen könnten, dies zu erreichen? Ich habe noch nie WCF-Anrufe auf einem Hintergrundthread ausgeführt. –

+0

Nein, ich wollte den lang laufenden WCF-Aufruf _from_ PHP in einem anderen Thread starten, also setzt das Skript seine Ausführung fort und gibt eine Antwort an den Browser zurück. Anschließend müssen Sie das Ergebnis in einer Datenbank oder in einer anderen Datenbank speichern. Auf diese Weise kann der Client benachrichtigt werden, wenn der WCF-Aufruf abgeschlossen wurde. – CodeCaster

+0

Die lange laufende Anfrage wird nur über eine REST API (in der gleichen Instanz von PHP) ausgeführt, die ich zur Verfügung gestellt habe. Ist es möglich, dies zu trennen und die reguläre Webseite nicht durch die PHP-Sitzungsdatei sperren zu lassen? –