类型'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);
}
}
答案 0 :(得分:1)
您无法明智地维护对wcf服务的调用之间的tcp连接。在你的情况下 我将从服务合同中删除Connect方法,在Service1类中将其更改为private, 从send方法中删除socket参数(在IService1及其在Service1类中的实现) 并从send方法调用connect方法(以便每次发送时连接和断开连接)
答案 1 :(得分:1)
在这种情况下,可能是因为您的服务上有一个公共方法,它以Socket作为参数。这很自然地,在尝试服务发现时无法正确序列化。
如果Send
仅在内部使用,请将其设为私有。
答案 2 :(得分:0)
错误消息具有误导性,解决方法是不向DataContractAttribute
添加System.Net.Sockets.Socket
。问题是您无法通过网络发送套接字。更具体地说,您无法对其进行序列化,要发送它,您必须能够对其进行序列化。
您需要找到一个不涉及通过网络发送套接字(或将其保存到磁盘/数据库)的解决方案。