none
WCF双向通信问题 RRS feed

  • 问题

  • 在学习Duplex双向通信中,发现如果我用console来做宿主,那么host启动后可以通过ie正常访问所暴露出来的服务地址,但当我用winform来做宿主时,同样的config文件和

    代码却无法访问所暴露出来的地址,不知道这是怎么回事?还请大伙指点一下
    2009年7月13日 7:13

答案

  • 终于找到问题所在了,原来是使用using语句造成的,大家都知道using有个自动释放资源的功能,所以有可能在通信过程中发送完request后就自动断开连接了。不知道我猜

    的对吗?如果有知道更详细点的还请指教。

    2009年7月15日 6:11
  • 终于找到问题所在了,原来是使用using语句造成的,大家都知道using有个自动释放资源的功能,所以有可能在通信过程中发送完request后就自动断开连接了。不知道我猜

    的对吗?如果有知道更详细点的还请指教。


    呵呵,我晕,貌似是这个问题哦。
       我测试的时候没使用Using语句来实例化宿主实例。
       Using 语句的这个方式,相当于Try{}catch(){}finally{},在{}内执行完就释放了宿主实例,你这里没有阻塞进程,基本点击执行完代码以后,销毁对象,就回收了对象的资源。这个是否立即回收取决于GC了。
      
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    • 已标记为答案 Xylon-tj 2009年7月15日 12:51
    2009年7月15日 9:42
    版主

全部回复

  • 那就把你的主要的配置信息或者主要的服务代码放出来,大家一起看看~
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年7月13日 9:33
    版主
  • contract:

    [ServiceContract(CallbackContract = typeof(IHelloIndigoServiceCallback))]
        public interface IHelloIndigoService
        {
            [OperationContract]
           void HelloIndigo(string message);
        }

        [ServiceContract]
        public interface IHelloIndigoServiceCallback
        {
            [OperationContract]
            void HelloIndigoCallback(string message);
        }

        [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
        public class HelloIndigoService : IHelloIndigoService
        {
          
            #region IHelloIndigoService Members

            void IHelloIndigoService.HelloIndigo(string message)
            {
                IHelloIndigoServiceCallback callback = OperationContext.Current.GetCallbackChannel<IHelloIndigoServiceCallback>();
                callback.HelloIndigoCallback(message);
            }

            #endregion
        }

    App.config:


      <system.serviceModel>
        <services>
          <service name="HelloIndigo.HelloIndigoService" behaviorConfiguration="serviceBehavior">
            <endpoint address="HelloIndigoService" binding="wsDualHttpBinding" contract="HelloIndigo.IHelloIndigoService" />
            <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8000"/>
                <add baseAddress="net.tcp://localhost:9000"/>
              </baseAddresses>
            </host>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="serviceBehavior">
              <serviceMetadata httpGetEnabled="true"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>

    winform:

            private void button1_Click(object sender, EventArgs e)
            {
                using (ServiceHost host = new ServiceHost(typeof(HelloIndigo.HelloIndigoService)))
                {
                    host.Open();
                 
                }
            }

    请指教!谢谢

    2009年7月14日 4:56
  • contract:

    [ServiceContract(CallbackContract = typeof(IHelloIndigoServiceCallback))]
        public interface IHelloIndigoService
        {
            [OperationContract]
           void HelloIndigo(string message);
        }

        [ServiceContract]
        public interface IHelloIndigoServiceCallback
        {
            [OperationContract]
            void HelloIndigoCallback(string message);
        }

        [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
        public class HelloIndigoService : IHelloIndigoService
        {
          
            #region IHelloIndigoService Members

            void IHelloIndigoService.HelloIndigo(string message)
            {
                IHelloIndigoServiceCallback callback = OperationContext.Current.GetCallbackChannel<IHelloIndigoServiceCallback>();
                callback.HelloIndigoCallback(message);
            }

            #endregion
        }

    App.config:


      <system.serviceModel>
        <services>
          <service name="HelloIndigo.HelloIndigoService" behaviorConfiguration="serviceBehavior">
            <endpoint address="HelloIndigoService" binding="wsDualHttpBinding" contract="HelloIndigo.IHelloIndigoService" />
            <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8000"/>
                <add baseAddress="net.tcp://localhost:9000"/>
              </baseAddresses>
            </host>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="serviceBehavior">
              <serviceMetadata httpGetEnabled="true"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>

    winform:

            private void button1_Click(object sender, EventArgs e)
            {
                using (ServiceHost host = new ServiceHost(typeof(HelloIndigo.HelloIndigoService)))
                {
                    host.Open();
                 
                }
            }

    请指教!谢谢


    好的,晚饭后帮你看看~呵呵
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年7月14日 11:52
    版主
  • 在学习Duplex双向通信中,发现如果我用console来做宿主,那么host启动后可以通过ie正常访问所暴露出来的服务地址,但当我用winform来做宿主时,同样的config文件和

    代码却无法访问所暴露出来的地址,不知道这是怎么回事?还请大伙指点一下

    Hi,
       你的问题我试验了一下,本地写了代码。我在确认一下你的问题,以免我理解错误。
    你的意思是:
    1.console来做宿主,IE里可以浏览服务的元数据对吗?
    2.你换为Winform宿主,这里使用的浏览地址是什么?
       如果IE查看的是服务的元数据,我本地测试的是都可以的。
       这里还有一个问题其实就是服务地址的问题。以前也和别人讨论过。你这里使用的是
    3. address="HelloIndigoService" ,有人说是相对地址,我也做了测试,这个相对有问题。
       我使用浏览器查看服务元数据的时候,基本使用的都是默认的http对应的默认的元数据交换地址。你这里应该是http://localhost:8000。运行宿主后可以直接查看。
        你在检查一下,如果你的意思是IE查看服务元数据,使用了tcp的地址,这里是无效的,WCF默认只提供http对应的元数据交换地址。
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年7月14日 14:55
    版主
  • 终于找到问题所在了,原来是使用using语句造成的,大家都知道using有个自动释放资源的功能,所以有可能在通信过程中发送完request后就自动断开连接了。不知道我猜

    的对吗?如果有知道更详细点的还请指教。

    2009年7月15日 6:11
  • 终于找到问题所在了,原来是使用using语句造成的,大家都知道using有个自动释放资源的功能,所以有可能在通信过程中发送完request后就自动断开连接了。不知道我猜

    的对吗?如果有知道更详细点的还请指教。


    呵呵,我晕,貌似是这个问题哦。
       我测试的时候没使用Using语句来实例化宿主实例。
       Using 语句的这个方式,相当于Try{}catch(){}finally{},在{}内执行完就释放了宿主实例,你这里没有阻塞进程,基本点击执行完代码以后,销毁对象,就回收了对象的资源。这个是否立即回收取决于GC了。
      
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    • 已标记为答案 Xylon-tj 2009年7月15日 12:51
    2009年7月15日 9:42
    版主
  • 我说Frank XuLei,问题根源就是using问题!
    按下边这么写就没问题了!
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using Service;
    using System.ServiceModel;
    using System.ServiceModel.Channels;
    
    namespace TestHost3
    {
        public partial class Form1 : Form
        {
            ServiceHost host = null;
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                host = new ServiceHost(typeof(MyService));
                host.Open();
                
            }
    
            private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                host.Close();
                host = null;
            }
        }
    }
    2009年10月29日 2:26
  • 你说的对,要自信,知道吗?
    2009年10月29日 2:30
  • 谢谢你对这个问题的回复。
    讨论技术的问题的话,你有必要这么说话吗。我看到你的留言了。
    WCF我只能说是了解,很多东西都不会。问题很多,我不可能什么都知道。
    也不可能什么一年都看出来。除了工作之外,我只是在空闲的时候来这里和大家交流一下。
    比我牛的人到处都是。


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年10月29日 14:39
    版主