none
怎么Host多个服务? RRS feed

  • 问题

  • config:
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <services>
          <service name="WpfBrowserAppServer.PG.LoginType" behaviorConfiguration="ServiceTypeBehaviors">
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8000/Wpf/"/>
                <add baseAddress="net.tcp://localhost:8010/Wpf/"/>
              </baseAddresses>
            </host>
            <endpoint address="Login" binding="basicHttpBinding" contract="WpfBrowserAppServer.PG.ILogin"/>
          </service>
          <service name="WpfBrowserAppServer.PG.MenuType" behaviorConfiguration="ServiceTypeBehaviors">
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8000/Wpf/"/>
                <add baseAddress="net.tcp://localhost:8010/Wpf/"/>
              </baseAddresses>
            </host>
            <endpoint address="Menu" binding="basicHttpBinding" contract="WpfBrowserAppServer.PG.IMenu"/>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="ServiceTypeBehaviors" >
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>
    

    C#:
    ServiceHost host = new ServiceHost(typeof(LoginType));
    ServiceHost host1 = new ServiceHost(typeof(MenuType));
    host.Open();
    host1.Open();
    Console.WriteLine("!");
    Console.ReadKey(true);
    host.Close();
    host1.Close();



    会有异常:
    未处理 System.InvalidOperationException
    “http://localhost:8000/Wpf/”处带有协定“\"IHttpGetHelpPageAndMetadataContract\"”的 ChannelDispatcher 无法打开其 IchannelListener。
    哪里错了吗??

    还有按着网上搜到得用
    foreach (ServiceElement el in svcmod.Services.Services)
    {
        Type svcType
    = Type.GetType(el.Name + "," + "WpfBrowserAppServer.PG");
        .....
    }
    svcType是null,直接用Type.GetType(el.Name)也是null,这怎么弄?

    help~~~

    ^_^
    2009年6月23日 15:09

答案

  • Hi~
    我是想做wpf浏览器应用程序,所以想抽库拉什么的放在server端操作,一般的输入内容的check就在wpf浏览器应用程序里做掉
    是不是要对前台公开一个类就要配置一个服务? 哈哈 我怕基本概念搞错了。。

    这样的话就会有n多服务要host出来,然后用svcutil 命令下载元数据,所以我想有什么方便的方法滚一个循环把他都host出来?


    ^_^

       1.呵呵,明白你的意思,肯定可以的啊。不过你新加的服务类,一般是DLL文件是更新的过的。
    HOST在引用的时候需要重新加载的,起码你是托管宿主要重新启动。
       2.你的这个代码,目的就是遍历所有的服务类,然后反射的方式创建服务实例是把。应该可以。
    foreach (ServiceElement el in svcmod.Services.Services),不过这个代码我没尝试过,你可以自己找找例子。
        修改配置文件这个最好了,不需要编译HOST,它只需要跟去配置文件来创建服务。
       3.客户端肯定要下载的啊,毕竟要调用新的服务啊,不然怎么调用呢,呵呵

    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年6月24日 4:23
    版主

全部回复

  • 不要用一个url
    就算是http://localhost:8000/  


    也要有  /wpf1  /wpf2

    紫柔版主的头像真叫萌得一个不行啊。。。。
    答案800 撒花
    2009年6月23日 15:13
  • Hi,
       你的代码我看了,问题可能很多。你现在错误是:未处理 System.InvalidOperationException
    “http://localhost:8000/Wpf/”处带有协定“\"IHttpGetHelpPageAndMetadataContract\"”的 ChannelDispatcher 无法打开其 IchannelListener。
    1.
    先来分析你现在的问题:这个错误信息应该和你的http/get方式的绑定有关系,而且还牵扯到你服务元数据的发布,监听的元数据服务端口无法代开,所以出了错误;
    2.配置文件里的问题:
    (1)服务地址重复:这个是一个方面,每个服务要使用不同的地址。<add baseAddress="http://localhost:8000/Wpf/>已经被第一个使用了,你第二个服务就不要在使用了,第二个可以修改为<add baseAddress="http://localhost:8001/Wpf/>
    "/(2) <endpoint address="Login" binding="basicHttpBinding" contract="WpfBrowserAppServer.PG.ILogin"/>。这个服务终结点配置有问题,你的address="Login",地址Login在配置文件里没有定义,所以这个地址也是无效的。
    (3)<endpoint address="Menu" binding="basicHttpBinding" contract="WpfBrowserAppServer.PG.IMenu"/>,address="Menu"问题同上。
    (4)服务的名字name="WpfBrowserAppServer.PG.MenuType",这个和你实际的服务发布地址要匹配:http://localhost:8000/Wpf/
    (5)反射方式创建服务实例的时候,命名空间:类名代码如下:最好使用Using方式生命实例,可以在对象生命周期结束时候,释放非托管资源
                using (ServiceHost host = new ServiceHost(typeof(WCFService.WCFService)))

          以上个人意见仅供参考,希望对你的调试有帮助,还有就是推荐一个WCF分布式开发步步为赢(2)自定义托管宿主WCF解决方案开发配置过程详解 ,你参考一下吧,有示例代码,里面有详细的配置过程。WCF配置确实有点麻烦,需要多注意细节。
         你要是有问题,我们继续在讨论~
        
         
    "/


    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年6月23日 16:49
    版主
  • Hi~
    我是想做wpf浏览器应用程序,所以想抽库拉什么的放在server端操作,一般的输入内容的check就在wpf浏览器应用程序里做掉
    是不是要对前台公开一个类就要配置一个服务? 哈哈 我怕基本概念搞错了。。

    这样的话就会有n多服务要host出来,然后用svcutil 命令下载元数据,所以我想有什么方便的方法滚一个循环把他都host出来?


    ^_^
    2009年6月23日 23:34
  • Hi~
    谢谢,等会儿试试看~
    ^_^
    2009年6月23日 23:44
  • Hi~
    我是想做wpf浏览器应用程序,所以想抽库拉什么的放在server端操作,一般的输入内容的check就在wpf浏览器应用程序里做掉
    是不是要对前台公开一个类就要配置一个服务? 哈哈 我怕基本概念搞错了。。

    这样的话就会有n多服务要host出来,然后用svcutil 命令下载元数据,所以我想有什么方便的方法滚一个循环把他都host出来?


    ^_^

       1.呵呵,明白你的意思,肯定可以的啊。不过你新加的服务类,一般是DLL文件是更新的过的。
    HOST在引用的时候需要重新加载的,起码你是托管宿主要重新启动。
       2.你的这个代码,目的就是遍历所有的服务类,然后反射的方式创建服务实例是把。应该可以。
    foreach (ServiceElement el in svcmod.Services.Services),不过这个代码我没尝试过,你可以自己找找例子。
        修改配置文件这个最好了,不需要编译HOST,它只需要跟去配置文件来创建服务。
       3.客户端肯定要下载的啊,毕竟要调用新的服务啊,不然怎么调用呢,呵呵

    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年6月24日 4:23
    版主
  • 试过了,可以是可以~谢谢~

    但是还有个问题:现在的做法是公开一个类就要加一段对应的config配置,还有用svcutil命令获取元数据,那真正的项目服务器端不可能只有1个类,要用N边svcutil??还有发布到IIS上要创建N各svc文件?
    有没有好点的办法?比如一次能把对应的整个项目发布出来,给client端调用?
    版主有msn qq吗?能交流学习下吗?
    ^_^
    2009年6月30日 11:56
  • 试过了,可以是可以~谢谢~

    但是还有个问题:现在的做法是公开一个类就要加一段对应的config配置,还有用svcutil命令获取元数据,那真正的项目服务器端不可能只有1个类,要用N边svcutil??还有发布到IIS上要创建N各svc文件?
    有没有好点的办法?比如一次能把对应的整个项目发布出来,给client端调用?
    版主有msn qq吗?能交流学习下吗?
    ^_^

    Hi,
       公用一个SVC文件可以吧,但是配置文件需要添加的啊。
       配置文件方式算是比较灵活的了。
       你现在要是开发阶段就无所谓啊,需要增加服务业正常啊,因为你服务在变化,客户端需要用新的服务就只有更新本地代码了~
       这个群是MSN的:group535993@msnzone.cn,大家可以一起讨论~
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年6月30日 12:36
    版主
  • Hi,
       你的代码我看了,问题可能很多。你现在错误是:未处理 System.InvalidOperationException
    “http://localhost:8000/Wpf/”处带有协定“\"IHttpGetHelpPageAndMetadataContract\"”的 ChannelDispatcher 无法打开其 IchannelListener。
    1.
    先来分析你现在的问题:这个错误信息应该和你的http/get方式的绑定有关系,而且还牵扯到你服务元数据的发布,监听的元数据服务端口无法代开,所以出了错误;
    2.配置文件里的问题:
    (1)服务地址重复:这个是一个方面,每个服务要使用不同的地址。<add baseAddress="http://localhost:8000/Wpf/>已经被第一个使用了,你第二个服务就不要在使用了,第二个可以修改为<add baseAddress="http://localhost:8001/Wpf/>
    "/(2) <endpoint address="Login" binding="basicHttpBinding" contract="WpfBrowserAppServer.PG.ILogin"/>。这个服务终结点配置有问题,你的address="Login",地址Login在配置文件里没有定义,所以这个地址也是无效的。
    (3)<endpoint address="Menu" binding="basicHttpBinding" contract="WpfBrowserAppServer.PG.IMenu"/>,address="Menu"问题同上。
    (4)服务的名字name="WpfBrowserAppServer.PG.MenuType",这个和你实际的服务发布地址要匹配:http://localhost:8000/Wpf/
    (5)反射方式创建服务实例的时候,命名空间:类名代码如下:最好使用Using方式生命实例,可以在对象生命周期结束时候,释放非托管资源
                using (ServiceHost host = new ServiceHost(typeof(WCFService.WCFService)))

          以上个人意见仅供参考,希望对你的调试有帮助,还有就是推荐一个WCF分布式开发步步为赢(2)自定义托管宿主WCF解决方案开发配置过程详解 ,你参考一下吧,有示例代码,里面有详细的配置过程。WCF配置确实有点麻烦,需要多注意细节。
         你要是有问题,我们继续在讨论~
        
         
    "/


    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com



    (2)、(3)中说的内容不正确吧,adress="Login"只是服务指定相对地址,不存在定义的问题吧?


    书山有路勤为径,学海无涯苦作舟
    2009年7月4日 15:01
  • Hi,
       你的代码我看了,问题可能很多。你现在错误是:未处理 System.InvalidOperationException
    “http://localhost:8000/Wpf/”处带有协定“\"IHttpGetHelpPageAndMetadataContract\"”的 ChannelDispatcher 无法打开其 IchannelListener。
    1.
    先来分析你现在的问题:这个错误信息应该和你的http/get方式的绑定有关系,而且还牵扯到你服务元数据的发布,监听的元数据服务端口无法代开,所以出了错误;
    2.配置文件里的问题:
    (1)服务地址重复:这个是一个方面,每个服务要使用不同的地址。<add baseAddress="http://localhost:8000/Wpf/>已经被第一个使用了,你第二个服务就不要在使用了,第二个可以修改为<add baseAddress="http://localhost:8001/Wpf/>
    "/(2) <endpoint address="Login" binding="basicHttpBinding" contract="WpfBrowserAppServer.PG.ILogin"/>。这个服务终结点配置有问题,你的address="Login",地址Login在配置文件里没有定义,所以这个地址也是无效的。
    (3)<endpoint address="Menu" binding="basicHttpBinding" contract="WpfBrowserAppServer.PG.IMenu"/>,address="Menu"问题同上。
    (4)服务的名字name="WpfBrowserAppServer.PG.MenuType",这个和你实际的服务发布地址要匹配:http://localhost:8000/Wpf/
    (5)反射方式创建服务实例的时候,命名空间:类名代码如下:最好使用Using方式生命实例,可以在对象生命周期结束时候,释放非托管资源
                using (ServiceHost host = new ServiceHost(typeof(WCFService.WCFService)))

          以上个人意见仅供参考,希望对你的调试有帮助,还有就是推荐一个WCF分布式开发步步为赢(2)自定义托管宿主WCF解决方案开发配置过程详解 ,你参考一下吧,有示例代码,里面有详细的配置过程。WCF配置确实有点麻烦,需要多注意细节。
         你要是有问题,我们继续在讨论~
        
         
    "/


    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com



    (2)、(3)中说的内容不正确吧,adress="Login"只是服务指定相对地址,不存在定义的问题吧?


    书山有路勤为径,学海无涯苦作舟
    Hi,
      你说Login 和Menu是服务指定的相对地址?我不是太明白你的意思。这里你能从配置文件里或者代码里看出相对位置的明确含义吗?如果最终这个地址还是你无法找到服务,你最终如何去访问服务。
      除非他使用了IIS7或更高版本,支持隐藏的地址注册。这个最终都要有有效的地址定义,不论你采取那种方式,应该道理都是一样的~

    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年7月5日 2:03
    版主
  • Hi,
       你的代码我看了,问题可能很多。你现在错误是:未处理 System.InvalidOperationException
    “http://localhost:8000/Wpf/”处带有协定“\"IHttpGetHelpPageAndMetadataContract\"”的 ChannelDispatcher 无法打开其 IchannelListener。
    1.
    先来分析你现在的问题:这个错误信息应该和你的http/get方式的绑定有关系,而且还牵扯到你服务元数据的发布,监听的元数据服务端口无法代开,所以出了错误;
    2.配置文件里的问题:
    (1)服务地址重复:这个是一个方面,每个服务要使用不同的地址。<add baseAddress="http://localhost:8000/Wpf/>已经被第一个使用了,你第二个服务就不要在使用了,第二个可以修改为<add baseAddress="http://localhost:8001/Wpf/>
    "/(2) <endpoint address="Login" binding="basicHttpBinding" contract="WpfBrowserAppServer.PG.ILogin"/>。这个服务终结点配置有问题,你的address="Login",地址Login在配置文件里没有定义,所以这个地址也是无效的。
    (3)<endpoint address="Menu" binding="basicHttpBinding" contract="WpfBrowserAppServer.PG.IMenu"/>,address="Menu"问题同上。
    (4)服务的名字name="WpfBrowserAppServer.PG.MenuType",这个和你实际的服务发布地址要匹配:http://localhost:8000/Wpf/
    (5)反射方式创建服务实例的时候,命名空间:类名代码如下:最好使用Using方式生命实例,可以在对象生命周期结束时候,释放非托管资源
                using (ServiceHost host = new ServiceHost(typeof(WCFService.WCFService)))

          以上个人意见仅供参考,希望对你的调试有帮助,还有就是推荐一个WCF分布式开发步步为赢(2)自定义托管宿主WCF解决方案开发配置过程详解 ,你参考一下吧,有示例代码,里面有详细的配置过程。WCF配置确实有点麻烦,需要多注意细节。
         你要是有问题,我们继续在讨论~
        
         
    "/


    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com



    (2)、(3)中说的内容不正确吧,adress="Login"只是服务指定相对地址,不存在定义的问题吧?


    书山有路勤为径,学海无涯苦作舟
    Hi,
      你说Login 和Menu是服务指定的相对地址?我不是太明白你的意思。这里你能从配置文件里或者代码里看出相对位置的明确含义吗?如果最终这个地址还是你无法找到服务,你最终如何去访问服务。
      除非他使用了IIS7或更高版本,支持隐藏的地址注册。这个最终都要有有效的地址定义,不论你采取那种方式,应该道理都是一样的~

    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.co

    请看wcf揭秘中,示例host的配置文件

    <services>
       <service name="DerivativesCalculator.DerivativesCalculatorServiceType"
    
     behaviorConfiguration="DerivativesCalculatorService">
        <host>
         <baseAddresses>
          <add baseAddress="http://localhost:8000/Derivatives/"/>
          <add baseAddress="net.tcp://localhost:8010/Derivatives/"/>
         </baseAddresses>
        </host>
        <endpoint
         address="Calculator"
         binding="netTcpBinding"
         contract="DerivativesCalculator.IDerivativesCalculator"
    
        />
       </service>
      </services>
      <behaviors>
       <serviceBehaviors>
        <behavior name="DerivativesCalculatorService">
         <serviceMetadata httpGetEnabled="true" />
        </behavior>
        <behavior name="NewBehavior">
         <serviceSecurityAudit auditLogLocation="Application" suppressAuditFailure="false"
          serviceAuthorizationAuditLevel="SuccessOrFailure" messageAuthenticationAuditLevel="SuccessOrFailure" />
        </behavior>
       </serviceBehaviors>
      </behaviors>
    

    书山有路勤为径,学海无涯苦作舟
    2009年7月5日 2:45
  • Hi,
      我查看了WCF揭秘,里面确实有你说的配置文件示例代码。
    这个程序能执行吗?如果有的话可以发送给我一份吗?frank_xl@163.com;谢谢。
      我现在不确定这个结论,关于WCF服务揭秘的代码下载我目前也没找到连接。
      
     你能把你的可执行程序,和资料的连接都发出来吗?WCF揭秘我目前拿到的是pdf的英文版本。
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年7月5日 5:55
    版主
  • 貌似address 后面的内容就是服务所在的类名。服务的主目录在baseAddress 中配置

    2009年7月28日 10:44
  • 貌似address 后面的内容就是服务所在的类名。服务的主目录在baseAddress 中配置


    Hi,
        你说的没错,这个确实是相对地址。我后来查了资料~但是首先在服务里要提供一个基地址~也就是baseAddress 呵呵
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年7月28日 13:15
    版主