我是照倒网上的例子,写了一个例子契约[OperationContract]
        string GetData();
        [OperationContract]
        string GetDataB();
        [OperationContract]
        void Ret(out string str, out string str2);        //datatable
        [OperationContract]
        System.Data.DataTable GetDataByTable();
实例契约 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;
        }
客户端的契约 [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”

解决方案 »

  1.   

    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;
            }
    改成这样就行了
      

  2.   

    谢谢楼上,其实我更多的是想传自己定义的对象,我的思路是在服务器定义一个类,
      [DataContract]
        public class ErrInfo
        {
            public short signErr;
            public string strErr;
        }
    然后再客户端定义一个这样一个类,然后就返回一个ErrInfo的对象
      

  3.   

    你可以直接定义了
    public class ErrInfo
      {
      public short signErr;
      public string strErr;
      }然后就可以用来传入传出,不受限制,也可以添加[DataContract]说明,这个[DataContract]是对于部分不可序列化的属性的情况下,只传递部分属性而用的,当添加了[DataContract]后,每个属性或字段都要有[DataMember],不使用的则不序列化传输。
      

  4.   

    我这里才发了一个WCF的演示项目:http://topic.csdn.net/u/20120408/15/10b29efd-6425-4f6d-b9d6-2c47c0ec4de0.html。里面涉及到的知识点很多,而代码量不大,非常适合学习,且很有技术深度,也用到了自定义的类,直接在接口项目中定义的,你下载了边看边调试就懂了。