Ich verwende WCF, um Informationen zwischen zwei identischen Kopien eines Programms auf separaten Computern zu übertragen, wobei der Ansatz auf einem einzelnen Computer im folgenden Code demonstriert wird. Ich weiß, dass .NET 4.5 supports compression out of the box und ich sehe eine XML-Implementierung in this question, aber ich verstehe nicht, wie Sie es in diesem Fall aktivieren. Wie kann ich das folgende Programm ändern, um die Komprimierung mit den wenigsten/einfachsten Änderungen zu verwenden?Wie kann ich die Komprimierung für WCF bei Verwendung von einfachem TCP aktivieren?
// 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");
}
}
}