示例#1
0
        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();
        }