2017-06-20 4 views
0

Ich habe einen WCF-Dienst erstellt und in IIS gehostet. Ich kann auf den WCF-Dienst zugreifen, indem ich eine Webreferenz in meiner asp.net-Webformularanwendung erstelle. Ich muss den WCF-Webdienst eine lange laufende Methode (async) ausführen lassen. Hat jemand einen guten Beispielcode, wie man eine asynchrone WCF-Methode von einer ASP.net-Webformular-Anwendungsschaltflächenklickmethode aufruft?ASP.NET Web Forms - wie asynchrone WCF asynchrone Methode aufrufen?

Ich habe IAsyncResult, EAP und TAP ... angesehen Was ist derzeit der beste Weg, um einen asynchronen Aufruf einer asynchronen WCF-Methode von einer ASP.NET Web Forms-Anwendung zu machen?

Ich habe jetzt meinen Code geändert, um eine Service-Referenz anstelle einer Web-Referenz zu verwenden.

Dienst ReceiptFooterService (Servicecontract, OperationsContract, Datacontract):

using System.Collections.Generic; 
using System.Net.NetworkInformation; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Threading.Tasks; 

namespace ReceiptFooterDeploymentService 
{ 
    [ServiceContract] 
    public interface IReceiptFooterService 
    { 
     [OperationContract(Name = "GetRegisterPingResults")] 
     Task<List<PingReply>> GetRegisterPingResults(List<StoreIP> potentialIPs); 
    } 

    [DataContract] 
    public class StoreIP 
    { 
     private int _storeNumber; 
     private string _ipAddress; 

     [DataMember] 
     public int StoreNumber 
     { 
      get 
      { 
       return _storeNumber; 
      } 
      set 
      { 
       _storeNumber = value; 
      } 
     } 

     [DataMember] 
     public string IPAddress 
     { 
      get 
      { 
       return _ipAddress; 
      } 
      set 
      { 
       _ipAddress = value; 
      } 
     } 
    } 
} 

ReceiptFooterService Klasse:

using System.Collections.Generic; 
using System.Linq; 
using System.Net.NetworkInformation; 
using System.Threading.Tasks; 

namespace ReceiptFooterDeploymentService 
{ 
    public class ReceiptFooterService : IReceiptFooterService 
    { 
     public async Task<List<PingReply>> GetRegisterPingResults(List<StoreIP> potentialIPs) 
     { 
      var tasks = potentialIPs.Select(sip => new Ping().SendPingAsync(sip.IPAddress, 1000)); 
      var results = await Task.WhenAll(tasks); 

      return results.ToList(); 
     } 
    } 
} 

ASP.NET Web-Formulare Client: Nur ersten Zeilen des Verfahrens (der Kürze halber)

private List<StoreDetail> PingStoreAndUpdateStatus(List<StoreDetail> storeDetails) 
{ 
    ReceiptFooterService.StoreIP[] potentialIPs = GetStoreRegisterIps(storeDetails).ToArray(); 
    ReceiptFooterService.ReceiptFooterServiceClient client = new ReceiptFooterService.ReceiptFooterServiceClient(); 
    List<PingReply> pingReplies = client.GetRegisterPingResultsAsync(potentialIPs).Result.ToList(); 

Ich versuche, etwa 2000 IP-Ping zu pingen wirkt asynchron. Ich erhalte vier Ergebnisse, die Erfolg zeigen. Allerdings werden keine anderen PingReply-Details angezeigt. Ich muss wissen, welche IP-Adresse gepingt wurde.

Sollte ich irgendwo warten ... ist das der Grund, warum es bald zurückkehrt, oder gibt es einen Fehler, der dazu führt, dass es fehlschlägt. Irgendwelche Vorschläge würden geschätzt werden.

Unten ist eine Schnellüberwachung meiner Ergebnisse:

+0

'Ich muss den WCF-Web-Service eine lange laufende Methode (async) laufen lassen.' - ['async' hat * nicht * die Kontrolle über den Browser] (https://msdn.microsoft.com/en- us/magazin/dn802603.aspx), wenn Sie daran denken. –

+0

Wie kann ich den Browser dazu bringen, den Dienst nach Abschluss der asynchronen Pings zurückzurufen? – tgerdes3609

+0

Ich empfehle SignalR zu verwenden. –

Antwort

0

Ich fand, dass für die Art von asynchroner Arbeit einen WCF-Web-Dienst ich tun musste (funktionierte nicht im Web-Service).

Ich wechselte zum Erstellen einer Konsole-Anwendung, die ich mit Argumenten aufrufen, und speichern Sie die Ergebnisse in einer Datenbank. Ich habe dann die Website Zugriff auf die Ergebnisse in der Datenbank gespeichert.

Der Konsolenanwendungskontext ist wesentlich benutzerfreundlicher, um die Menge an asynchronen Methoden zu vervollständigen, die ich gleichzeitig ausführen wollte.

0

Zuerst, wenn WCF, warum Sie Dienstverweis nicht verwenden? (Web vs Service reference) Wenn dann SOAP-Client verwendet wird, generiert es automatisch SOAP WCF-Client mit jeder Methode mit synchroner und asynchronous Variante.
Dann rufen Sie ihn nur Asynchron-Methode

MyServiceClient.DummyMethodAsync (someParameters ...)

+0

Es kann hilfreich sein, wenn ich meinen Quellcode zeige. Ich werde das später veröffentlichen. – tgerdes3609

Verwandte Themen