none
求助WsHttp协议的问题! RRS feed

  • 问题

  • 有如下代码:

    HttpGetlib.dll:
    
    ImyContract.cs
    
    namespace HttpGetLib
    {
        [ServiceContract(Name = "MyContract", Namespace = "http://www.yeminggeng.com/2009/06/MyContract")]
        public interface IMyContract
        {
            [OperationContract(Name = "Print", Action = "http://www.yeminggeng.com/2009/06/MyContract/Print")]
            void Print(String s);
        }
    }
    
    
    MyContract.cs
    
    
    namespace HttpGetLib
    {
        public class MyContract : IMyContract
        {
    
            public void Print(string s)
            {
                Console.WriteLine("from client data is:"+s);
            }
    
        }
    }
    
    
    服务器端代码:
    
    App.config:
    
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.serviceModel>
            <behaviors>
                <serviceBehaviors>
                    <behavior name="HttpGetLib.MyContractBehavior">
                        <serviceMetadata httpGetEnabled="true" />
                        <serviceDebug includeExceptionDetailInFaults="false" />
                      //可以响应的客户端只有一个
                      <serviceThrottling maxConcurrentSessions="1"/>
                    </behavior>
                </serviceBehaviors>
            </behaviors>
            <services>
                <service behaviorConfiguration="HttpGetLib.MyContractBehavior"
                    name="HttpGetLib.MyContract">
                    <endpoint address="MyContract" binding="wsHttpBinding" contract="HttpGetLib.IMyContract" bindingConfiguration="ymgwsHttpBinding"/>
                  <endpoint address="MyContract" binding="netTcpBinding" contract="HttpGetLib.IMyContract" bindingConfiguration="ymgnetTcpBinding"/>
                    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
                    <host>
                        <baseAddresses>
                            <add baseAddress="net.tcp://localhost:1238/HttpGetLib" />
                            <add baseAddress="http://localhost:1234/HttpGetLib" />
                        </baseAddresses>
                    </host>
                </service>
            </services>
          <bindings>
            <wsHttpBinding>
              <binding name="ymgwsHttpBinding">
                <reliableSession enabled="true"/>
              </binding>
            </wsHttpBinding>
            <netTcpBinding>
              <binding name="ymgnetTcpBinding">
                <reliableSession enabled="true"/>
              </binding>
            </netTcpBinding>
          </bindings>
        </system.serviceModel>
    </configuration>
    
    
    Program.cs
    
    namespace Host
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (ServiceHost host = new ServiceHost(typeof(HttpGetLib.MyContract)))
                {
                    host.Open();
                    Console.WriteLine("host is starting......");
                    Console.ReadLine();
                }
            }
        }
    }
    
    
    客户端代码:
    
    
    namespace WinClient
    {
        public partial class Form1 : Form
        {
            private MyContractClient client;
            public Form1()
            {
                InitializeComponent();
                client = new MyContractClient("NetTcpBinding_MyContract");
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                client.Print(textBox1.Text);
            }
        }
    }
    
    
    

     

    先启动一个客户端,在tesxbox中输入“ymg”,点确定,此时在服务器端的控制台中就会输出“from client data is:ymg”,再启动另一个客户端窗口,在Textbox中输入“yeminggeng”,点确定,此时并不会在服务器端的控制台中输出“from client data is:yeminggeng”,因为maxConcurrentSessions="1",第二个窗口的操作在服务器端的队列中,需要等待。关闭第一个客户端,在服务器端立刻打印出“from client data is:yeminggeng”。

    以上过程是使用tcp协议操作的,下面换成wshttp协议。

    client = new MyContractClient("WshttpBinding_MyContract");重复上面的过程,第二个窗口一直处于等待状态,关闭第一个窗口,在服务器端的控制台并不会打印“from client data is:yeminggeng”。

    请各位朋友看一下士什么原因,谢谢!

     


    yeminggeng
    2009年6月15日 2:46

答案

  • 你好,
    maxConcurrentSessions的生效依赖与当前的session。session一般来说能够通过两种方式提供。一种是使用tcp transport,(比如你用netTcpBinding的情况),另外一种是通过在transport上层的信道获得。(比如你用wsHttpBinding时应用了security,那么就能够提供session)。换句话说,对于你的例子,maxConcurrentSessions能够生效的情况是:
    1.使用netTcpBinding
    2.使用Security不为none的wsHttpBinding

    这两种方式又是有区别的。当session依赖于transport时,socket关闭后session就立即失效。而使用依赖于transport上层信道时,即便socket关闭了session也不会失效,必须由客户端主动关闭整个信道通知服务器,服务器才能知道session失效了。

    所以,当你用netTcpBinding时关闭了窗口,session就立即失效(还是有一点TCP的ack延迟)。而使用wsHttpBinding的时候不失效(等超时后失效)。你可以通过close你的proxy来显示通知服务器端。

    综上所述,良好的编程习惯是在关闭窗口的事件中显示调用close方法来关闭信道。

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    2009年6月17日 1:41
    版主