我目前正在 Windows 服务(不是 IIS)中运行一些 WCF REST 服务,使用WebServiceHost
. 我为每个服务定义了一个单独的接口和类,但是我在理解如何WebServiceHost
,ServiceEndpoint
并且ServiceContracts
可以一起使用来创建自托管解决方案时遇到了一些问题。
我目前设置的方式是WebServiceHost
为每个实现服务的类创建一个新的,并将类的名称用作 URI 的一部分,然后在接口中定义 URI 的其余部分。
[ServiceContract]
public interface IEventsService
{
[System.ServiceModel.OperationContract]
[System.ServiceModel.Web.WebGet(UriTemplate = "EventType", ResponseFormat=WebMessageFormat.Json)]
List<EventType> GetEventTypes();
[System.ServiceModel.OperationContract]
[System.ServiceModel.Web.WebGet(UriTemplate = "Event")]
System.IO.Stream GetEventsAsStream();
}
public class EventsService: IEventsService
{
public List<EventType> GetEventTypes() { //code in here }
public System.IO.Stream GetEventsAsStream() { // code in here }
}
创建服务的代码如下所示:
Type t = typeof(EventService);
Type interface = typeof(IEventService);
Uri newUri = new Uri(baseUri, "Events");
WebServicesHost host = new WebServiceHost(t, newUri);
Binding binding = New WebHttpBinding();
ServiceEndpoint ep = host.AddServiceEndpoint(interface, binding, newUri);
这很好用,每个服务的服务端点都是在适当的 url 上创建的。
http://XXX.YYY.ZZZ:portnum/Events/EventType
http://XXX.YYY.ZZZ:portnum/Events/Event
然后我重复另一个服务接口和服务类。我想删除Events
URL 中的,但是如果我这样做并WebServiceHosts
使用相同的基本 URL 创建多个,我会收到错误:
The ChannelDispatcher at 'http://localhost:8085/' with contract(s) '"IOtherService"' is unable to open its IChannelListener
内部例外:
"A registration already exists for URI 'http://localhost:8085/'."
我试图了解WebServiceHost
,ServiceEndpoint
和如何ServiceContract
协同工作来创建 ChannelListener。
我是否需要WebServiceHost
为每个实现服务的类单独设置一个?我没有看到用一个注册多种类型的方法WebServiceHost
其次,我将接口传递给 AddServceEndpoint 方法,并且我假设该方法检查对象的所有 OperationContract 成员并添加它们,问题是 WebServiceHost 如何知道哪个类应该映射到哪个接口。
我想要的是创建一个 WCF 自托管服务的示例,该服务运行多个服务,同时保持接口和实现类分开。