Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算通过WCF的包(datacontract)的大小?_C#_.net_Wcf_Size_Datacontract - Fatal编程技术网

C# 计算通过WCF的包(datacontract)的大小?

C# 计算通过WCF的包(datacontract)的大小?,c#,.net,wcf,size,datacontract,C#,.net,Wcf,Size,Datacontract,是否可以计算通过WCF发送的(复杂的)对象(带有dataContract)的大小?我需要的是计算请求和响应对象的大小,我需要在winform应用程序中这样做 我可以将对象序列化,然后获得总大小吗?我认为消息拦截器会有所帮助,您可以将此端点行为添加到端点并处理httpwebrequest/response 更多信息,谷歌WCF消息拦截器,你会发现很多有用的东西 希望这会有所帮助。您可以使用来跟踪这两条消息,然后您可以看到通过WCF传输的实际消息。但是,这个工具似乎无法获得总大小 可能会有帮助。您可

是否可以计算通过WCF发送的(复杂的)对象(带有dataContract)的大小?我需要的是计算请求和响应对象的大小,我需要在winform应用程序中这样做


我可以将对象序列化,然后获得总大小吗?

我认为消息拦截器会有所帮助,您可以将此端点行为添加到端点并处理httpwebrequest/response

更多信息,谷歌WCF消息拦截器,你会发现很多有用的东西

希望这会有所帮助。

您可以使用来跟踪这两条消息,然后您可以看到通过WCF传输的实际消息。但是,这个工具似乎无法获得总大小


可能会有帮助。

您可以自己手动序列化/反序列化对象。下面是一个序列化和获取长度的简单示例

[DataContract(Name = "Person", Namespace = "http://www.woo.com")]
    class Person
    {
        [DataMember()]
        public string Name;
        [DataMember()]
        public int Age;        
    }
呼叫代码(在控制台应用程序中)


关于自动执行此操作,例如在每次WCF调用中,您可能需要创建自己的,并将其添加到消息中。

这不会得到消息的大小,因为WCF会在数据契约通过连接之前将其包装在信封中。在某些情况下,信封可能比邮件大。我完全同意,上面只计算了最初要求的“对象”的大小:)是的,我确实想到了这一点,但正如你所说,它的大小不正确。我不知道消息拦截器的情况,但我还没有找到一种方法来计算通过网络传输的包的实际大小。因此……看来你需要侵入WCF框架?据我所知,WCF没有提供任何方法来监控真实的网络流量。创建自己的绑定元素怎么样?如果使用ssl,数据将被加密。。。所以,我建议您尝试从WCF中找到解决方案…Windows钩子?我很高兴WCF(和所有.net套接字)使用IOCP底层,你可以尝试在这里进行一些黑客攻击。是的,我知道,但很多其他信息都记录在那里,很难遵循流程。我刚刚在博客中介绍了配置。应该很容易看到消息发生了什么。
        Person p = new Person();
        p.Name = "Sean Cocteau";
        p.Age = 99;

        DataContractSerializer ds = new DataContractSerializer(p.GetType());

        using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
        {
            ds.WriteObject(ms, p);                
            // Spit out

            Console.WriteLine("Output: " + System.Text.Encoding.UTF8.GetString(ms.ToArray()));
            Console.WriteLine("Message length: " + ms.Length.ToString());
        }

        Console.ReadKey();