0

无法序列化类型“System.Net.Sockets.Socket”。考虑使用 DataContractAttribute 属性对其进行标记,并使用 DataMemberAttribute 属性标记您想要序列化的所有成员。

我正在 WCF 中创建一项服务,该服务打开连接并向服务器发送消息,但是当我运行该服务时出现上述错误。我不知道如何用数据契约属性标记它或如何解决问题。

public class Service1 : IService1
{


    public void Connect(String a , String b)
    {

        int hit = Convert.ToInt32(a);

        int delay = Convert.ToInt32(b);
        delay = delay * 1000; 

 // I have eliminated the log making part       string LogPath = "C:\\VoltTestApp\\Logs\\";


        for (int i = 1; i <= hit; i++)
        {

            try
            {
                TcpClient tcpClient = new TcpClient("10.111.13.72", 80);
                Console.WriteLine("Initialized Socket  .............\n");
                Socket socket = tcpClient.Client;
                string str = "ID_T$";

                try
                { // sends the text with timeout 10s
                    Console.WriteLine("Going To Send Request  .............\n");
                    Send(socket, Encoding.UTF8.GetBytes(str.Trim()), 0, str.Length, 10000);
               }


                socket.Close();
                tcpClient.Close();
                Console.WriteLine("Socket Closed  .............\n");
            }

            Thread.Sleep(delay);
        }

    }



    public  void Send(Socket socket, byte[] buffer, int offset, int size, int timeout)
    {
        try
        {
            int startTickCount = Environment.TickCount;
            int sent = 0;  // how many bytes is already sent
            do
            {
                if (Environment.TickCount > startTickCount + timeout)
                    throw new Exception("Timeout.");
                try
                {
                    sent += socket.Send(buffer, offset + sent, size - sent, SocketFlags.None);
                }
                catch (SocketException ex)
                {
                    if (ex.SocketErrorCode == SocketError.WouldBlock ||
                        ex.SocketErrorCode == SocketError.IOPending ||
                        ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
                    {
                        // socket buffer is probably full, wait and try again
                        Thread.Sleep(30);
                    }
                    else
                        throw ex;  // any serious error occurr
                }
            } while (sent < size);
        }

    }
4

3 回答 3

1

您无法明智地在对 wcf 服务的调用之间保持 tcp 连接。在您的情况下,我将从服务合同中删除 Connect 方法,在您的 Service1 类中将其更改为私有,从您的发送方法中删除套接字参数(在 IService1 及其在 Service1 类中的实现中)并调用您的连接方法您的发送方法(以便每次发送都连接和断开连接)

于 2012-07-11T12:15:49.057 回答
1

在这种情况下,可能是因为您的服务上有一个以 Socket 作为参数的公共方法。这很自然地在尝试服务发现时无法正确序列化。

如果Send仅在内部使用,请将其设置为私有。

于 2012-07-11T12:22:51.783 回答
0

该错误消息具有误导性,解决方案是不要添加DataContractAttributeSystem.Net.Sockets.Socket. 问题是您无法通过网络发送套接字。更具体地说,您不能对其进行序列化,并且要发送它,您必须能够对其进行序列化。

您需要找到一个不涉及通过网络发送套接字(或将其保存到磁盘/数据库)的解决方案。

于 2012-07-11T12:00:18.427 回答