当我编写以下代码以在WCF中托管REST Web服务时,我试图了解后台发生了什么:
RouteTable.Routes.Add(new ServiceRoute("", new WebServiceHostFactory(),
typeof(MyConcreteService)));
此外,类定义是这样的:
public class MyConcreteService : IService
其中IService使用WebGET等定义ServiceContract和OperationContract
在设置路线时,我从不在任何地方提到IService
。服务器如何找出要使用的合同?有人可以说明在后台进行的秘密,使网络服务工作吗?
答案 0 :(得分:3)
WebServiceHostFactory
返回WebServiceHost
的实例。该类将查看服务类本身是否使用[ServiceContract]
进行修饰 - 如果是,它将使用它作为合同类型。否则,它将查找服务类实现的接口,以查看哪些接口使用[ServiceContract]
进行修饰。如果它只找到一个(在您的示例中就是这种情况),那么它将是用作合同类型的那个。如果它找到0或大于1,它应该抛出异常。
拥有合同类型,WebServiceHost
将添加具有该合同类型的端点,相应的绑定(WebHttpBinding
)和空的相对地址。它还将为Web端点添加适当的行为(WebHttpBehavior
)。基本上就是这样;它可以做其他事情,比如在需要时设置内容类型映射器等,但WebServiceHost(和WebServiceHostFactory)类的优点是你不需要知道它(在大多数情况下)。