WCF客户端代理不触发BeginExecute回调

时间:2017-02-14 10:33:29

标签: c# .net wcf odata

我发现有时候OData服务(v2)的BeginExecute方法的回调不会触发。仅当有多个并行异步请求正在运行时才会出现这种情况。 一些示范代码:

    public void Run()
    {
        Service = new SAP.TEST_SRV_Entities(new Uri(@"https://..."));
        Service.Credentials = new NetworkCredential("user", "password");
        Service.MergeOption = System.Data.Services.Client.MergeOption.NoTracking;

        for (int i = 0; i < 6; i++)
        {
            AsyncCallback callback = new AsyncCallback(Response);
            string url = @"https://...";
            Service.BeginExecute<SAP.Folder>(new Uri(url), callback, null);
            Console.WriteLine("Request");
            //System.Threading.Thread.Sleep(1000);
        }
    }

    void Response(IAsyncResult asyncResult)
    {
        Console.WriteLine("Response");
        List<SAP.Folder> sapfolders = Service.EndExecute<SAP.Folder>(asyncResult).ToList();
    }

该计划的输出是:

Request
Request
Request
Request
Request
Request
Response
Response
Response
Response

6个请求已启动,但只有4个已结束。 我的服务器上没有收到丢失的两个请求。如果我在请求之间插入一个睡眠,或者它们被称为同步,那么每件事都很好,我得到所有的回复。 在我看来,第一个请求不正确完成。增加ServicePointManager.DefaultConnectionLimit会导致更多已完成的请求。 代码由wpf按钮的事件处理程序调用,因此应用程序没有退出。

如果我错过了在http请求的WebResponse上调用close,我会收到类似的错误。在WCF找不到“关闭”。

知道如何获得所有回复吗?在第一次回复中有没有像某些关闭/结束通话那样的缺失?

1 个答案:

答案 0 :(得分:0)

由于我没有找到解决方案,我将使用解决方法。而不是使用异步方法,将在自己的线程中使用同步。