日期:2014-05-18  浏览次数:21412 次

关于wcf传递datatable问题,在线等
我是照倒网上的例子,写了一个例子

契约
C# code

[OperationContract]
        string GetData();
        [OperationContract]
        string GetDataB();
        [OperationContract]
        void Ret(out string str, out string str2);

        //datatable
        [OperationContract]
        System.Data.DataTable GetDataByTable();



实例契约
C# code

 public void Ret(out string str, out string str2)
        {
            str = "str";
            str2 = "str2";
        }

        public string GetData()
        {
            return string.Format("A");
        }

        public string GetDataB()
        {
            return string.Format("B");
        }

        public System.Data.DataTable GetDataByTable()
        { 
            DataTable dt= new DataTable();
            dt.Columns.Add("ss");
            DataRow dr = dt.NewRow();
            dt.Rows.Add(dr);
            dr["ss"] = "ss";
            return dt;
        }



客户端的契约
C# code

 [ServiceContract]
    public interface IWcfService
    {
        [OperationContract]
        string GetData();
        [OperationContract]
        string GetDataB();
        [OperationContract]
        void Ret(out string str,out string str2);
        
        [OperationContract]
        System.Data.DataTable GetDataByTable();
        
        // TODO: 在此添加您的服务操作
    }

//访问
IWcfService server;
        private void Form1_Load(object sender, EventArgs e)
        {
            server = ChannelFactory<IWcfService>.CreateChannel
                (new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:918/WcfService"));
        }

        private void btnA_Click(object sender, EventArgs e)
        {
            DataTable dt = server.GetDataByTable();
            MessageBox.Show("");
        }

        private void btnB_Click(object sender, EventArgs e)
        {
            string str,str2;
            server.Ret(out str,out str2); 
            MessageBox.Show(str2);
        }





其它函数都能访问,但就是返回Datatable的GetDataByTable通过断点调试确实执行了服务器GetDataByTable函数,但客户端一直在DataTable dt = server.GetDataByTable();处报错:
套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“00:00:59.8900000”

------解决方案--------------------
C# code
public System.Data.DataTable GetDataByTable()
        { 
            DataTable dt= new DataTable("temp");
            dt.Columns.Add("ss");
            DataRow dr = dt.NewRow();
            dt.Rows.Add(dr);
            dr["ss"] = "ss";
            return dt;
        }

------解决方案--------------------
你可以直接定义了
public class ErrInfo
{
public short signErr;
public string strErr;
}

然后就可以用来传入传出,不受限制,也可以添加[DataContract]说明,这个[DataContract]是对于部分不可序列化的属性的情况下,只传递部分属性而用的,当添加了[DataContract]后,每个属性或字段都要有[DataMember],不使用的则不序列化传输。