none
WindowsService 如何调用 WCF RRS feed

  • 问题

  • 新建 WindowsService1,引用 WCF 的服务。插入以下代码:

        protected override void OnStart(string[] args)
        {
          Service1Client sc = new Service1Client();
        }
    

    该服务被安装后,启动失败!

    去掉 Service1Client sc = new Service1Client(); 换别的代码,则 window service 启动成功。

    首先保证不是 WCF 网站的程序问题,因为该 WCF 网站给 sl 和 form 调用,都能正常。

    那么,请问 window service 的项目中,该如何来 调用 WCF ,并让 该服务 正常运行?

    2010年9月11日 17:14

答案

全部回复

  • 我猜测

    你的服务未启动是,缺少客户端终结点配置信息。

    默认  Service1Client sc = new Service1Client();会从配置文件里读取终结点信息。

    Window 服务默认是没有配置文件的,这个会实例化出错。

    你可以通过代码来指定 终结点地址。

    这样应该就没问题了


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    老徐的博客】:http://www.cnblogs.com/frank_xl/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    • 已标记为答案 lfj0912 2010年9月16日 0:02
    2010年9月13日 7:31
    版主
  • 谢谢版主的 指点 !

    App.config 的 文件内容如下:

     <system.serviceModel>
     <bindings>
      <basicHttpBinding>
      <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
       allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
       maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
       messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
       useDefaultWebProxy="true">
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
       maxBytesPerRead="4096" maxNameTableCharCount="16384" />
       <security mode="None">
       <transport clientCredentialType="None" proxyCredentialType="None"
        realm="" />
       <message clientCredentialType="UserName" algorithmSuite="Default" />
       </security>
      </binding>
      </basicHttpBinding>
     </bindings>
     
     <client>
      <endpoint address="http://localhost:8080/Service.svc" binding="basicHttpBinding"
      bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
      name="BasicHttpBinding_IService1" />
     </client>
     </system.serviceModel>
    

    1. 把 App.config 的 文件,复制到服务文件同一目录下,还是无法启动。

    2.想把 App.config 的 文件读入到程序中,但不知道该怎么处理?

      string configFile = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "App.config");
      
      if (!File.Exists(configFile))
      {
      Trace.TraceWarning("Service configuration file not found");
      return;
      }
      
      XmlDocument xmlConfig = new XmlDocument();
      xmlConfig.Load(configFile);
    

    3.用您推荐的方法 :通过代码来指定 终结点地址,后面还是不知道该怎么写?

      BasicHttpBinding binding = new BasicHttpBinding();
      binding.Name = "BasicHttpBinding_IService1";
      binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
      binding.Security.Mode = BasicHttpSecurityMode.None;
    
      Uri baseAddress = new Uri("http://localhost:8080/Service.svc");
      //EndpointIdentity epi = new EndpointIdentity ();
    
      //AddressHeaderCollection ahc = new AddressHeaderCollection ();
      //EndpointAddress epa = new EndpointAddress(baseAddress ,epi,ahc);
      
    

     

    • 已编辑 lfj0912 2010年9月14日 23:02
    2010年9月14日 14:11
  • 1.你不需要自己读取配置文件,WCF客户端会自动处理。

    2.Service1Client 实例化方法里有个可以设置 string类型的 address的,你直接传递http://localhost:8080/Service.svc和BasicHttpBinding 就可以了。

    不指定的话,WCF都使用默认的配置。

     


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    老徐的博客】:http://www.cnblogs.com/frank_xl/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    • 已标记为答案 lfj0912 2010年9月16日 0:02
    2010年9月14日 14:28
    版主
  • 那 为什么 在windowservice中 WCF 客户端 不读取 App.config 的文件呢?而在 form 的项目中,就可以自动读取?
    2010年9月15日 0:28
  • 那 为什么 在windowservice中 WCF 客户端 不读取 App.config 的文件呢?而在 form 的项目中,就可以自动读取?


    你配置文件的位置对吗?

    检查一下安装目录


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    老徐的博客】:http://www.cnblogs.com/frank_xl/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    2010年9月15日 1:13
    版主
  • window_form 的启动文件同目录下,有 App.config 文件,可以启动。

    但 window_service 安装后,在服务的启动文件同目录下,同样有 App.config,而服务为什么 无法 读取 配置文件?

    2010年9月15日 2:20
  • 放到系统目录下试试
    2010年9月15日 9:30