积极答复者
怎么Host多个服务?

问题
-
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~~~
^_^
答案
-
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- 已标记为答案 Allen Chen - MSFTModerator 2009年6月30日 2:59
全部回复
-
-
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 -
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- 已标记为答案 Allen Chen - MSFTModerator 2009年6月30日 2:59
-
试过了,可以是可以~谢谢~
但是还有个问题:现在的做法是公开一个类就要加一段对应的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 -
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,
你的代码我看了,问题可能很多。你现在错误是:未处理 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"只是服务指定相对地址,不存在定义的问题吧?
书山有路勤为径,学海无涯苦作舟
你说Login 和Menu是服务指定的相对地址?我不是太明白你的意思。这里你能从配置文件里或者代码里看出相对位置的明确含义吗?如果最终这个地址还是你无法找到服务,你最终如何去访问服务。
除非他使用了IIS7或更高版本,支持隐藏的地址注册。这个最终都要有有效的地址定义,不论你采取那种方式,应该道理都是一样的~
Frank.Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
老徐的博客:http://frank_xl.cnblogs.com -
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"只是服务指定相对地址,不存在定义的问题吧?
书山有路勤为径,学海无涯苦作舟
你说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>
书山有路勤为径,学海无涯苦作舟 -
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 -
貌似address 后面的内容就是服务所在的类名。服务的主目录在baseAddress 中配置
Hi,
你说的没错,这个确实是相对地址。我后来查了资料~但是首先在服务里要提供一个基地址~也就是baseAddress 呵呵
Frank.Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
老徐的博客:http://frank_xl.cnblogs.com