自托管WCF服务 - 令人困惑的行为

时间:2011-01-03 22:56:16

标签: c# .net wcf .net-4.0 self-hosting

我正在学习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。弹出服务页面。总而言之 - 它工作但不是我想象的方式,我似乎错过了一些东西。

问题:

  1. 为什么在我没有在ServiceHost构造函数中提供可选的baseAddresses参数时服务失败 - 尝试在添加服务端点时提供地址?

  2. 我可以“按照我最初想要的方式”实现目标吗?

  3. 致以最诚挚的问候,并希望尽快收到任何WCF专家的意见。

1 个答案:

答案 0 :(得分:1)

Greg Sansom回答了你的第一个问题。 至于第二个可以做到的:请看看Juval Lowy的ServiceModelEx类(特别是ServiceHost)download here它包含几个有用的WCF类