public void ReadRequestAndWriteResponse() { IPAddress[] addressList = Dns.GetHostEntry(Environment.MachineName).AddressList; var endpoint = new IPEndPoint(addressList[addressList.Length - 1], 9900); var listener = new TcpListener(endpoint); listener.Start(); var t = new Thread(new ThreadStart(() => { var c = listener.AcceptTcpClient(); var handle = new HttpProtocolHandle(c.GetStream()); //read remoting request Trace.WriteLine(handle.ReadFirstLine()); DumpHelper.DumpDictionary(handle.ReadHeaders()); var messageRequest = BinaryFormatterHelper.DeserializeObject(handle.ReadContent()) as MethodCall; //HACK:SoapFormatter not work well //http://labs.developerfusion.co.uk/SourceViewer/browse.aspx?assembly=SSCLI&namespace=System.Runtime.Remoting //var f = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter(); //f.Context = new System.Runtime.Serialization.StreamingContext(System.Runtime.Serialization.StreamingContextStates.Other); //var mc = new MethodCall(this.Parse(headers)); //var messageRequest = f.Deserialize(new System.IO.MemoryStream(content), new HeaderHandler(mc.HeaderHandler)); Assert.IsNotNull(messageRequest); DumpHelper.DumpMessage(messageRequest); //write remoting response var responeMessage = new MethodResponse(new Header[] { new Header(MessageHeader.Return, messageRequest.Args[0]) }, messageRequest); var responseStream = BinaryFormatterHelper.SerializeObject(responeMessage); handle.WriteResponseFirstLine("200", "ok"); handle.WriteHeaders(new Dictionary <string, object>() { { HttpHeader.ContentLength, responseStream.Length } }); handle.WriteContent(responseStream); //end httprequest c.Close(); })); t.Start(); //use BinaryFormatter via HTTP var channel = new HttpChannel(new Hashtable(), new BinaryClientFormatterSinkProvider(), null); ChannelServices.RegisterChannel(channel, false); var url = string.Format("http://{0}/remote.rem", endpoint); var service = RemotingServices.Connect(typeof(ServiceClass), url) as ServiceClass; Assert.AreEqual("Hi", service.Do("Hi")); t.Abort(); ChannelServices.UnregisterChannel(channel); }
public void ReadRequestAndWriteResponse() { IPAddress[] addressList = Dns.GetHostEntry(Environment.MachineName).AddressList; var endpoint = new IPEndPoint(addressList[addressList.Length - 1], 9900); var listener = new TcpListener(endpoint); listener.Start(); var t = new Thread(new ThreadStart(() => { var c = listener.AcceptTcpClient(); var handle = new TcpProtocolHandle(c.GetStream()); //read remoting request Console.WriteLine("Preamble: {0}", handle.ReadPreamble()); Console.WriteLine("MajorVersion: {0}", handle.ReadMajorVersion()); Console.WriteLine("MinorVersion: {0}", handle.ReadMinorVersion()); var op = handle.ReadOperation(); Assert.AreEqual(TcpOperations.Request, op); Console.WriteLine("Operation: {0}", op); Console.WriteLine("ContentDelimiter: {0}", handle.ReadContentDelimiter()); Console.WriteLine("ContentLength: {0}", handle.ReadContentLength()); DumpHelper.DumpDictionary(handle.ReadTransportHeaders()); var messageRequest = BinaryFormatterHelper.DeserializeObject(handle.ReadContent()) as MethodCall; Assert.IsNotNull(messageRequest); DumpHelper.DumpMessage(messageRequest); //write remoting response var responeMessage = new MethodResponse(new Header[] { new Header(MessageHeader.Return, messageRequest.Args[0]) }, messageRequest); var responseStream = BinaryFormatterHelper.SerializeObject(responeMessage); handle.WritePreamble(); handle.WriteMajorVersion(); handle.WriteMinorVersion(); handle.WriteOperation(TcpOperations.Reply); handle.WriteContentDelimiter(TcpContentDelimiter.ContentLength); handle.WriteContentLength(responseStream.Length); handle.WriteTransportHeaders(null); handle.WriteContent(responseStream); })); t.Start(); var url = string.Format("tcp://{0}/remote.rem", endpoint); var service = RemotingServices.Connect(typeof(ServiceClass), url) as ServiceClass; Assert.AreEqual("Hi", service.Do("Hi")); t.Abort(); }