ASP.NET Web表单 - 如何异步调用WCF异步方法?

时间:2017-06-20 20:25:59

标签: c# asp.net .net wcf asynchronous

我创建了一个WCF服务并将其托管在IIS中。我可以通过在我的asp.net Web表单应用程序中创建Web引用来访问WCF服务。我需要让WCF Web服务运行一个长时间运行的方法(异步)。有没有人有如何从asp.net Web表单应用程序按钮单击方法调用WCF异步方法的良好示例代码?

我看过IAsyncResult,EAP和TAP ...... 目前,从ASP.NET Web表单应用程序对WCF异步方法进行异步调用的最佳方法是什么?

我现在更改了我的代码以使用服务引用而不是Web引用。

Service 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类:

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表单客户端:只有该方法的前几行(为简洁起见)

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();

我试图异步ping大约2000个IP地址。我得到了四个显示成功的结果。虽然,其他PingReply细节都没有显示出来。我需要知道什么是IP地址。

我应该等待某个地方......这就是为什么它很快就会回来,或者是否有一个错误导致它失败。任何建议将不胜感激。

下面是我的结果的快速观察:

2 个答案:

答案 0 :(得分:0)

首先,使用WCF时为什么不使用服务参考? (Web vs Service reference) 然后,当使用SOAP客户端时,它会使用同步和asynchronous变体的每个方法自动生成SOAP WCF客户端。
然后你只需要调用这个异步方法

  

MyServiceClient.DummyMethodAsync(someParameters ...)

答案 1 :(得分:0)

我发现使用WCF Web服务进行我需要做的异步工作(不是在Web服务中工作)。

我切换到创建一个我用参数调用的控制台应用程序,然后将结果存储在数据库中。然后我让网站访问存储在数据库中的结果。

控制台应用程序上下文对于完成我想要同时运行的异步方法的数量要友好得多。