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:
'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. –
Wie kann ich den Browser dazu bringen, den Dienst nach Abschluss der asynchronen Pings zurückzurufen? – tgerdes3609
Ich empfehle SignalR zu verwenden. –