【发布时间】:2014-04-07 15:42:57
【问题描述】:
我目前正在使用WebServiceHost 在 Windows 服务(不是 IIS)中运行一些 WCF REST 服务。我为每个服务定义了一个单独的接口和类,但我在理解如何将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,但如果我这样做并使用相同的基本网址创建多个WebServiceHosts,我会收到错误:
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 自托管服务的示例,该服务运行多个服务,同时保持接口和实现类分开。
【问题讨论】:
标签: c# wcf rest webservicehost