Thomas
Thomas

Reputation: 34188

WCF Exception : ServiceHost only supports class service types -- when run from windows service

i am new in wcf. i am facing this error ServiceHost only supports class service types.

here i will say i am doing & running my win service & wcf together. i added windows service project and also add few reference like System.ServiceModel for wcf in win service project. when i am trying to run wcf service from win service then i am getting error called ServiceHost only supports class service types

i search & got many answer like

ServiceHost host = new ServiceHost(
                       typeof(subservice.ISubService), new Uri("someuri"));

If this is your usage, change it to use the implemented service class type of ISubService

ServiceHost host = new ServiceHost(
                       typeof(subservice.SubService), new Uri("someuri"));

If configuring the service in .svc then:

<%@ServiceHost Service="subservice.SubService"%>

Also in you config file, change service name to the service instead of the service contract as:

   <services>
          <service name="subservice.SubService">
          ...

other search result also said very similar things to get rid of this problem.

i have no svc file for my wcf service. i have just one file where i have contract and service classes. i also have config file.

here i am giving the brief of my service code

namespace SageDataImportWCF
{
    [ServiceContract]
        public interface ISagePart
        {

            [OperationContract]
            string SageInsertionProcess(string SQLConnectionString, string CountryCode);

            // TODO: Add your service operations here
        }

     public class SagePartInsertion : ISagePart
     {
            public string SageInsertionProcess(string SQLConnectionString, string CountryCode)
            {
            }
     }
}

here i am giving the code by which i am trying to run from win service

namespace SageDataImportWCF
{
    public partial class SageDateInsertionService : ServiceBase
    {
        #region Local Variables
        ServiceHost serviceHost;
        #endregion

        #region Constructor
        public SageDateInsertionService()
        {
            InitializeComponent();
            serviceHost = null;
            ServiceName = "Sage DataInsertion Service";
        }
        #endregion

        protected override void OnStart(string[] args)
        {
            string strAdrHTTP = "http://192.168.6.2:11000/SagePartInsertion";
            if (serviceHost != null)
            {
                serviceHost.Close();
            }
            serviceHost = new ServiceHost(typeof(SageDataImportWCF.SagePartInsertion));
            serviceHost.AddServiceEndpoint(typeof(SageDataImportWCF.ISagePart), new BasicHttpBinding(), strAdrHTTP);
            ServiceMetadataBehavior behaviour = new ServiceMetadataBehavior();
            behaviour.HttpGetEnabled = true;
            serviceHost.Description.Behaviors.Add(behaviour);
            serviceHost.Open();
        }

        protected override void OnStop()
        {
            if (serviceHost != null)
            {
                serviceHost.Close();
                serviceHost = null;
            }
        }
    }
}

here is my config entry for wcf service

<configuration>
    <system.serviceModel>
        <services>
            <service name="SageDataImportWCF.SagePartInsertion" behaviorConfiguration="SageBehavior">
                <endpoint address="http://localhost:9001/SagePartInsertion"  contract="SageDataImportWCF.ISagePart" binding="basicHttpBinding"/>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="SageBehavior">
                    <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                    <serviceMetadata httpGetEnabled="true"/>
                    <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                    <serviceDebug includeExceptionDetailInFaults="true"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    </system.serviceModel>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
    </system.webServer>
</configuration>

here i have pasted all the relevant code and i like to request some one please have a look at my code and tell me why i am getting the error message like ServiceHost only supports class service types when try to run it from windows service. did i miss anything in code ?

should i have a separate project for wcf class library and another separate project for windows service because i have one project there i have files for wcf & windows service both.

so looking for suggestion like what i need to rectify in code as a result win service can start the wcf service. please help.

Upvotes: 2

Views: 2231

Answers (1)

DanielV
DanielV

Reputation: 2670

Check the definition of the service in the Markup:

Right click on the SagePartInsertion.svc file and select "View Markup".

Make sure the service is the implementation of the interface, like this:

<%@ ServiceHost Language="C#" Debug="true" Service="SageDataImportWCF.SagePartInsertion" CodeBehind="SagePartInsertion.svc.cs" %>

In the past it failed because I was referencing the interface.

Upvotes: 0

Related Questions