我正在学习WCF,作为一项实践练习,我决定为ServiceHost类编写通用包装器。我们的想法是建立一个类似下面的类:
public class Host<I(nterface), S(ervice)>
where S : I, new()
{
/**/
ServiceHost mServiceHost;
S mServiceInstance = new S();
}
I type是具有[ServiceContract]
属性&amp;的接口。 S类型是实现上述接口的服务。
我在同一时间创建了一个辅助的hello-world类型服务来测试我的课程。
在Host的构造函数中,我实例化了内部ServiceHost:
mServiceHost = new ServiceHost(mServiceInstance);
我添加了服务端点:
mServiceHost.AddServiceEndPoint(typeof(I), new BasicHttpBinding(), new Uri("http://localhost:40000/MyTestService"));
稍后我打开主机,启动了我的应用程序并试图查看我的浏览器是否会在“http:// localhost:40000 / MyTestService”下显示一个服务 - 我得到一个空白页面和所有尝试添加服务引用失败。
我后来在ServiceHost的构造函数中添加了相同的Uri:
mServiceHost = new ServiceHost(mServiceInstance, new Uri("http://localhost:40000/MyTestService"));
该构造函数的第二个参数是:
params string[] baseAddresses
或
params Uri[] baseAddresses
无论如何,“params”关键字的存在告诉我这个参数是可选的。
我已经重新启动了我的应用,并且(使用浏览器)导航到了uri。弹出服务页面。总而言之 - 它工作但不是我想象的方式,我似乎错过了一些东西。
问题:
为什么在我没有在ServiceHost构造函数中提供可选的baseAddresses参数时服务失败 - 尝试在添加服务端点时提供地址?
我可以“按照我最初想要的方式”实现目标吗?
致以最诚挚的问候,并希望尽快收到任何WCF专家的意见。
答案 0 :(得分:1)
Greg Sansom回答了你的第一个问题。 至于第二个可以做到的:请看看Juval Lowy的ServiceModelEx类(特别是ServiceHost)download here它包含几个有用的WCF类