none
调用部署在本机IIS服务器的WCF服务并返回数据DataTable,一直报错:远程主机强迫关闭了一个现有的连接。但是服务访问正常,请问怎么解决? RRS feed

  • 问题

  • WCF服务部署在本机IIS服务器,浏览器访问正常。

    但是调用时,返回DataTable数据就报错:

    远程主机强迫关闭了一个现有的连接。

    说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

    异常详细信息: System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接。

    源错误: 
    行 153:        
    行 154:        public System.Data.DataTable GetClientList(string str) {
    行 155:            return base.Channel.GetClientList(str);
    行 156:        }
    行 157:        

    堆栈跟踪: 

    [SocketException (0x2746): 远程主机强迫关闭了一个现有的连接。] System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) +6556175 System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) +130 [IOException: 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。] System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) +296 System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size) +19 System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead) +251 [WebException: 基础连接已经关闭: 接收时发生错误。] System.Net.HttpWebRequest.GetResponse() +6557544 System.ServiceModel.Channels.HttpChannelRequest.WaitForReply(TimeSpan timeout) +55 [CommunicationException: 接收对 http://10.10.101.242:8095/ClientService.svc 的 HTTP 响应时发生错误。

    这可能是由于服务终结点绑定未使用 HTTP 协议造成的。

    这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。有关详细信息,请参见服务器日志。] System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +10990855 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +336 CCtrmPro.ClientManageService.IClientManagementService.GetClientList(String str) +0 CCtrmPro.ClientManageService.ClientManagementServiceClient.GetClientList(String str) in g:\Service References\ClientService\Reference.cs:155 CCtrmPro.ClientManagement.ClientInformation.InitClientList() in g:\Client\ClientInformation.aspx.cs:37 CCtrmPro.ClientManagement.ClientInformation.Page_Load(Object sender, EventArgs e) in g:\CCtrmPro\Client\ClientInformation.aspx.cs:19 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51 System.Web.UI.Control.OnLoad(EventArgs e) +92 System.Web.UI.Control.LoadRecursive() +54 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772

    搜索了一下,网上有说,这是 WCF来传递DataTable的Bug

    请问怎么解决呢?



    • 已编辑 Ryan0007 2017年2月10日 1:26
    2017年2月10日 1:25

答案

  • Hi Ryan0007,

    为了确认是不是DataTable相关的代码有问题, 我建议你添加一个新的方法,这个方法只返回一个简单的String, 比如“Hello World”. 如果结果显示只有返回DataTable的方法出错,我建议你把GetClientList这个方法里的代码分享给我们看下。

    我对于 DataTable做了下面的测试,是没有问题的。
    Service

            public DataTable GetTable()
            {
                MakeParentTable();
                DataTable dt = dataSet.Tables[0];
                return dt;
            }
            private System.Data.DataSet dataSet;
            private void MakeParentTable()
            {
                // Create a new DataTable.
                System.Data.DataTable table = new DataTable("ParentTable");
                // Declare variables for DataColumn and DataRow objects.
                DataColumn column;
                DataRow row;
    
                // Create new DataColumn, set DataType, 
                // ColumnName and add to DataTable.    
                column = new DataColumn();
                column.DataType = System.Type.GetType("System.Int32");
                column.ColumnName = "id";
                // Add the Column to the DataColumnCollection.
                table.Columns.Add(column);
    
                // Create second column.
                column = new DataColumn();
                column.DataType = System.Type.GetType("System.String");
                column.ColumnName = "ParentItem";
                // Add the column to the table.
                table.Columns.Add(column);
    
                // Instantiate the DataSet variable.
                dataSet = new DataSet();
                // Add the new DataTable to the DataSet.
                dataSet.Tables.Add(table);
    
                // Create three new DataRow objects and add 
                // them to the DataTable
                for (int i = 0; i <= 2; i++)
                {
                    row = table.NewRow();
                    row["id"] = i;
                    row["ParentItem"] = "ParentItem " + i;
                    table.Rows.Add(row);
                }
            }
    

    Client

                DbOperationService.DbOperationClient client = new DbOperationService.DbOperationClient();
                DataTable dt = client.GetTable();
                MessageBox.Show(dt.Rows.Count.ToString());

    我建议你测试下上面的代码,看下是否跟你创建的DataTable有关系。

    Best Regards,

    Edward


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 Ryan0007 2017年2月10日 8:35
    2017年2月10日 3:14
    版主

全部回复

  • Hi Ryan0007,

    为了确认是不是DataTable相关的代码有问题, 我建议你添加一个新的方法,这个方法只返回一个简单的String, 比如“Hello World”. 如果结果显示只有返回DataTable的方法出错,我建议你把GetClientList这个方法里的代码分享给我们看下。

    我对于 DataTable做了下面的测试,是没有问题的。
    Service

            public DataTable GetTable()
            {
                MakeParentTable();
                DataTable dt = dataSet.Tables[0];
                return dt;
            }
            private System.Data.DataSet dataSet;
            private void MakeParentTable()
            {
                // Create a new DataTable.
                System.Data.DataTable table = new DataTable("ParentTable");
                // Declare variables for DataColumn and DataRow objects.
                DataColumn column;
                DataRow row;
    
                // Create new DataColumn, set DataType, 
                // ColumnName and add to DataTable.    
                column = new DataColumn();
                column.DataType = System.Type.GetType("System.Int32");
                column.ColumnName = "id";
                // Add the Column to the DataColumnCollection.
                table.Columns.Add(column);
    
                // Create second column.
                column = new DataColumn();
                column.DataType = System.Type.GetType("System.String");
                column.ColumnName = "ParentItem";
                // Add the column to the table.
                table.Columns.Add(column);
    
                // Instantiate the DataSet variable.
                dataSet = new DataSet();
                // Add the new DataTable to the DataSet.
                dataSet.Tables.Add(table);
    
                // Create three new DataRow objects and add 
                // them to the DataTable
                for (int i = 0; i <= 2; i++)
                {
                    row = table.NewRow();
                    row["id"] = i;
                    row["ParentItem"] = "ParentItem " + i;
                    table.Rows.Add(row);
                }
            }
    

    Client

                DbOperationService.DbOperationClient client = new DbOperationService.DbOperationClient();
                DataTable dt = client.GetTable();
                MessageBox.Show(dt.Rows.Count.ToString());

    我建议你测试下上面的代码,看下是否跟你创建的DataTable有关系。

    Best Regards,

    Edward


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 Ryan0007 2017年2月10日 8:35
    2017年2月10日 3:14
    版主
  •  

    非常感谢Edward的热心回答!

    是DataTable相关的代码有问题,我的datatable数据直接是从数据库读取出来的。

    经过修改,服务可以返回DataTable数据了。

    2017年2月10日 8:39