私は現在、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
に連携して ChannelListener を作成するかを理解しようとしています。ServiceEndpoint
ServiceContract
WebServiceHost
サービスを実装するクラスごとに個別に必要ですか? 複数のタイプを単一のタイプに登録する方法がわかりませんWebServiceHost
次に、インターフェイスを AddServceEndpoint メソッドに渡しています。メソッドがすべての OperationContract メンバーのオブジェクトをチェックして追加すると仮定します。問題は、どのクラスがどのインターフェイスにマップされるべきかを WebServiceHost がどのように認識するかです。
私が気に入っているのは、インターフェイスと実装クラスを分離しながら複数のサービスを実行する WCF 自己ホスト型サービスを作成する例です。