2010-07-14 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel.Channels / TcpRequestChannel.cs
index 9424e538da17a1e39418ee20eafa384bc014c76a..6ce9f7c6b07efb0bbed15196899b9e272990eb88 100644 (file)
@@ -66,6 +66,7 @@ namespace System.ServiceModel.Channels
 
                protected override void OnOpen (TimeSpan timeout)
                {
+                       CreateClient (timeout);
                }
 
                void CreateClient (TimeSpan timeout)
@@ -78,15 +79,15 @@ namespace System.ServiceModel.Channels
                                Encoder = this.Encoder,
                                Via = this.Via,
                                EncodingRecord = TcpBinaryFrameManager.EncodingBinary };
-                       frame.ProcessPreambleInitiator ();
-                       frame.ProcessPreambleAckInitiator ();
                }
 
                public override Message Request (Message input, TimeSpan timeout)
                {
                        DateTime start = DateTime.Now;
 
-                       CreateClient (timeout);
+                       // FIXME: use timeouts.
+                       frame.ProcessPreambleInitiator ();
+                       frame.ProcessPreambleAckInitiator ();
 
                        if (input.Headers.To == null)
                                input.Headers.To = RemoteAddress.Uri;
@@ -95,11 +96,12 @@ namespace System.ServiceModel.Channels
 
                        frame.WriteUnsizedMessage (input, timeout - (DateTime.Now - start));
 
-                       // It somehow sends EndRecord now ...
-                       frame.ProcessEndRecordInitiator ();
+                       // LAMESPEC: it contradicts the protocol described at section 3.1.1.1.1 in [MC-NMF].
+                       // Moving this WriteEndRecord() after ReadUnsizedMessage() causes TCP connection blocking.
+                       frame.WriteEndRecord ();
 
                        var ret = frame.ReadUnsizedMessage (timeout - (DateTime.Now - start));
-                       frame.ProcessEndRecordRecipient (); // both
+                       frame.ReadEndRecord (); // both
                        return ret;
                }
        }