Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# 使用简单TCP时,如何启用WCF压缩?_C#_.net_Wcf - Fatal编程技术网

C# 使用简单TCP时,如何启用WCF压缩?

C# 使用简单TCP时,如何启用WCF压缩?,c#,.net,wcf,C#,.net,Wcf,我正在使用WCF在不同计算机上的程序的两个相同副本之间传输信息,下面的代码在一台计算机上演示了这种方法。我知道.NET4.5,我在中看到了XML实现,但我不知道在这种情况下如何启用它。我如何修改下面的程序以使用压缩,并进行最少/最简单的更改 // Reference to System.ServiceModel class Program { static void Main(string[] args) { var server = new DemoWcfSer

我正在使用WCF在不同计算机上的程序的两个相同副本之间传输信息,下面的代码在一台计算机上演示了这种方法。我知道.NET4.5,我在中看到了XML实现,但我不知道在这种情况下如何启用它。我如何修改下面的程序以使用压缩,并进行最少/最简单的更改

// Reference to System.ServiceModel
class Program
{
    static void Main(string[] args)
    {
        var server = new DemoWcfServer();
        var handler = new DemoWcfHandler();

        Uri serviceUri = new Uri("net.tcp://localhost/SimpleWcfDemo");
        var binding = new NetTcpBinding();
        binding.MaxBufferSize = 100000000;
        binding.MaxReceivedMessageSize = 100000000;

        var host = new ServiceHost(server, serviceUri);
        host.AddServiceEndpoint(typeof(IDemoWcfServer), binding, "");
        host.Open();

        var cf = new DuplexChannelFactory<IDemoWcfServer>(handler, binding, new EndpointAddress(serviceUri));
        IDemoWcfServer serviceProxy = cf.CreateChannel();

        serviceProxy.DoStuff(BigString('T', 1000000));
        Console.ReadKey();
    }

    static string BigString(char c, int n)
    {
        var sb = new StringBuilder();
        for (int i = 0; i < n; i++)
            sb.Append(c);
        return sb.ToString();
    }

    [ServiceContract(CallbackContract = typeof(IDemoWcfCallback))]
    public interface IDemoWcfServer
    {
        [OperationContract]
        void DoStuff(string content);
    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    public class DemoWcfServer : IDemoWcfServer
    {
        public void DoStuff(string content)
        {
            Console.WriteLine("Content of " + content.Length + " length received remotely; processing...");
            IDemoWcfCallback callback = OperationContext.Current.GetCallbackChannel<IDemoWcfCallback>();
            Task.Run(async () =>
            {
                await Task.Delay(TimeSpan.FromSeconds(3));
                callback.NotifyStuffComplete(BigString('R', 1000000));
            });
        }
    }

    public interface IDemoWcfCallback
    {
        [OperationContract]
        void NotifyStuffComplete(string content);
    }

    public class DemoWcfHandler : IDemoWcfCallback
    {
        public void NotifyStuffComplete(string content)
        {
            Console.WriteLine("Response of " + content.Length + " length received");
        }
    }
}
//对System.ServiceModel的引用
班级计划
{
静态void Main(字符串[]参数)
{
var server=new DemoWcfServer();
var handler=new DemoWcfHandler();
Uri serviceUri=新的Uri(“网络。tcp://localhost/SimpleWcfDemo");
var binding=新的NetTcpBinding();
binding.MaxBufferSize=100000000;
binding.MaxReceivedMessageSize=100000000;
var host=新的ServiceHost(服务器,serviceUri);
AddServiceEndpoint(typeof(IDemoWcfServer),绑定“”;
host.Open();
var cf=新的DuplexChannelFactory(处理程序、绑定、新端点地址(serviceUri));
IDemoWcfServer serviceProxy=cf.CreateChannel();
DoStuff(BigString('T',1000000));
Console.ReadKey();
}
静态字符串BigString(字符c,整数n)
{
var sb=新的StringBuilder();
对于(int i=0;i
{
等待任务延迟(时间跨度从秒(3));
NotifyStuffComplete(BigString('R',1000000));
});
}
}
公共接口回拨
{
[经营合同]
作废完成(字符串内容);
}
公共类DemowFHandler:IDemoWcfCallback
{
public void NotifyStuffComplete(字符串内容)
{
Console.WriteLine(“响应“+内容.长度+”接收长度”);
}
}
}

中的答案通过使用自定义绑定来解决它。您可以按照中的说明自己执行此操作。

要创建包含压缩(.NET 4.5+)的自定义绑定,请替换此选项:

var binding = new NetTcpBinding();
binding.MaxBufferSize = 100000000;
binding.MaxReceivedMessageSize = 100000000;
为此:

var binding = new CustomBinding();
var be1 = new BinaryMessageEncodingBindingElement();
be1.CompressionFormat = CompressionFormat.GZip;
binding.Elements.Add(be1);
var be2 = new TcpTransportBindingElement();
be2.MaxBufferSize = 100000000;
be2.MaxReceivedMessageSize = 100000000;
binding.Elements.Add(be2);
binding = new CustomBinding(binding);
通过监听端口808的本地环回,可以使用(或Wireshark)验证所需的行为。通过压缩,只有14个数据包交换,没有一个数据包的有效负载大于1200字节。如果不进行压缩,则有238个数据包,其中许多数据包大于64k