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

この例では、おそらく、Socket をパラメーターとして受け取る public メソッドがサービスにあるためです。これは、当然のことながら、サービス ディスカバリを試行するときに適切にシリアル化できません。

Send内部でのみ使用する場合は、プライベートとして設定します。

于 2012-07-11T12:22:51.783 に答える
0

エラー メッセージは誤解を招きます。解決策は に a を追加しないことDataContractAttributeですSystem.Net.Sockets.Socket。問題は、ネットワーク経由でソケットを送信できないことです。より具体的には、シリアル化することはできません。送信するには、シリアル化できる必要があります。

ネットワーク経由でソケットを送信する (またはディスク/データベースに保存する) 必要のない解決策を見つける必要があります。

于 2012-07-11T12:00:18.427 に答える