这个主题在这里讨论了很多,但没有一个答案是真正准确的。我有一个使用 nettcpbinding 创建的 wcf 服务。我想检查在服务器和客户端之间传输的消息大小/发送数据速率/接收数据速率。该服务是双工通道,客户端代码是通过添加服务引用自动生成的。两个应用程序(客户端/服务器)都是用 C# .Net 4.0 编写的。使用默认二进制编码器的 nettcp 绑定和服务器端的配置设置如下:
<bindings>
<netTcpBinding>
<binding name="largeMessage"
receiveTimeout="infinite"
sendTimeout="24:00:00"
openTimeout="00:00:10"
closeTimeout="00:00:10"
maxReceivedMessageSize="2147483647"
maxBufferSize="2147483647"
maxConnections="2000"
transactionFlow="false"
listenBacklog="2147483647"
maxBufferPoolSize="2147483647">
<readerQuotas maxDepth="128"
maxArrayLength="200000000"
maxStringContentLength="2147483647"/>
<security mode="None" />
<reliableSession enabled="false" ordered="true" inactivityTimeout="infinite" />
</binding>
</netTcpBinding>
</bindings>
该服务是自托管的,并通过创建以下内容作为控制台应用程序启动:
ServiceHost host = new ServiceHost(serviceObject, addresses);
我使用wireshark 来获取一般统计数据和传输的tcp 数据包,我发现我的数据速率非常高。所以我想检查在客户端和服务器之间传输的每个消息大小。为此,我使用了几种技术来测量此论坛中建议的消息大小,但它们都没有提供与wireshark 完全相同的大小。
我已经测试了以下内容: WCF - 以编程方式测量近似消息大小
此链接: http ://winterdom.com/2009/07/comparing-text-and-binary-serialization-in-wcf/
并在我的代码中做到了这一点:
static byte[] SerializeToBin<T>(T obj)
{
Message msg = ObjectToMessage(obj);
MessageEncodingBindingElement mebe = new BinaryMessageEncodingBindingElement();
mebe.MessageVersion = MessageVersion.Soap12;
return Serialize(msg, mebe.CreateMessageEncoderFactory());
}
static byte[] Serialize(Message msg, MessageEncoderFactory factory)
{
MessageEncoder enc = factory.Encoder;
MemoryStream stream = new MemoryStream();
enc.WriteMessage(msg, stream);
return stream.ToArray();
}
static Message ObjectToMessage<T>(T obj)
{
DataContractSerializer ser = new DataContractSerializer(typeof(T));
return Message.CreateMessage(MessageVersion.Soap12, "", obj, ser);
}
它没有给出准确的结果。
然后我尝试添加一个消息检查器并按照本文 http://devlicio.us/blogs/derik_whittaker/archive/2011/02/03/how-to-中的建议收听之前/之后 - 发送/接收消息intercept-a-wcf-message-to-track-message-size.aspx 并调用此函数:
private void DetermineAndLogMessageDiagnostics(ref Message message, eMessageDirection messageDirection)
{
long sizeInBytes = 0;
var mb = message.CreateBufferedCopy(int.MaxValue);
message = mb.CreateMessage();
var ms = new MemoryStream();
using (var memWriter = XmlDictionaryWriter.CreateBinaryWriter(ms))
{
mb.CreateMessage().WriteMessage(memWriter);
memWriter.Flush();
sizeInBytes = ms.Position;
}
//Recalculates the updated average and updates the variables
//sentBytes, averageSentbps, receivedBytes, averageReceivedbps
RecalculateAverage(bodySizeInBytes, messageDirection);
Logger.Info("Message '{0}' size: {1} bits / {2} bytes. ({3} KBits). Sent (Total: {4} Bytes, {5:0.00} bps). Received (Total: {6} Bytes, {7:0.00} bps)",
action,
sizeInBytes * 8,
sizeInBytes,
((double)sizeInBytes * 8) / 1024,
sentBytes,
averageSentbps,
receivedBytes,
averageReceivedbps
);
}
这也不能给出准确的结果。当我说不准确时 - 我的意思是大约 300 - 500 字节的差异。但差距不是恒定的。
我不想创建自定义绑定,因为我想检查 netTcpBinding 并且不想更改任何配置。
有人对这个问题有准确的解决方案吗?
感谢您阅读这么长的问题描述。
并提前感谢任何建议的解决方案。