My goal is to create a host application that can analyze multiple assemblies, discover contracts, and host services.
To load a service, we usually need to hardcode the servicehost instance. The following code works, even though this is not the behavior I'm looking for.
ServiceHost wService1Host = new ServiceHost(typeof(Service1)); wService1Host.Open(); ServiceHost wService2Host = new ServiceHost(typeof(Service2)); wService2Host.Open();
However, this means that I know in advance what services will be. I do not mind having a link to assemblies containing services. I just want the host not to know what services are contained in the assemblies. For example, if I add a new service to one of the assemblies, no changes will be required on the host side.
This is very similar to question , but with additional complexity for the above reason.
Here is the host code I came to. I am not opposed to managing services at the moment, I just want them to be downloaded properly.
class Program { static void Main(string[] args) {
When I try to create a serviceHost, I get the following error:
"It is illegal to reflect on the custom attributes of a Type loaded via ReflectionOnlyGetType (see Assembly.ReflectionOnly) -- use CustomAttributeData instead."
In the link above, the guy seems to have solved his problem using typeof, since he knows in advance what service he wants to expose. Unfortunately, this is not my business.
Note. For the hosting part, I actually have 3 projects. The first of these is the host application (see above), the second is the assembly containing my entire service contract (interfaces), and the last assembly contains the implementation of services.
Here is the app.config application that I actually use to host the services. The assembly containing the implementation is called "WcfServices" and contains 2 services. One of them displays callbacks and other basic services.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="metadataBehavior"> <serviceMetadata httpGetEnabled="true"/> </behavior> </serviceBehaviors> </behaviors> <services> <service name="WcfServices.Service1" behaviorConfiguration="metadataBehavior"> <endpoint address="Service1Service" binding="basicHttpBinding" contract="WcfServices.IService1" name="basicHttp"/> <endpoint binding="mexHttpBinding" contract="IMetadataExchange" name="metadataExchange"/> <host> <baseAddresses> <add baseAddress="http://localhost:8000/Service1"/> </baseAddresses> </host> </service> <service name="WcfServices.Service2" behaviorConfiguration="metadataBehavior"> <endpoint address="Service2Service" binding="wsDualHttpBinding" contract="WcfServices.IService2"/> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> <host> <baseAddresses> <add baseAddress="http://localhost:8000/Service2"/> </baseAddresses> </host> </service> </services> </system.serviceModel> </configuration>
So, to be clear, here is what I am looking for:
1. Load assemblies in the current application directory
2. Understands if there are any contracts in it.
3. If so, create these services (using app.config for now)
First, is this possible? (My guess would be like this, since an application called wcfstorm alread looks like this)
Obviously, how can I make the code above work?
Thanks!