6

I'm trying to create a service host for my WCF application. When I start the app I get an error saying

The service cannot be started. This service has no endpoint defined. Please add at least one endpoint for the service in config file and try again.

I followed the tutorial on PluralSight and this is the code I came up with

using System.ServiceModel;
using FreedomService;

namespace ConsoleHost
{
    class Program
    {
        static void Main(string[] args)
        {
            var host = new ServiceHost(typeof(PeopleService));
            host.AddServiceEndpoint(typeof (IPeopleService), new BasicHttpBinding(),
                                    "http://localhost:8080/people/basic");
            host.AddServiceEndpoint(typeof(IPeopleService), new WSHttpBinding(), 
                                    "http://localhost:8080/people/ws");
            host.AddServiceEndpoint(typeof(IPeopleService), new NetTcpBinding(), 
                                    "net.tcp://localhost:8081/people");
            try
            {
                host.Open();
                PrintServiceInfo(host);
                Console.ReadLine();
                host.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                host.Abort();
            }
        }

        static void PrintServiceInfo(ServiceHost host)
        {
            Console.WriteLine("{0} is up and running with these endpoints:",host.Description.ServiceType);
            foreach (var endpoint in host.Description.Endpoints)
            {
                Console.WriteLine(endpoint.Address);
            }
        }

    }
}

IPeopleService.cs

[ServiceContract]
public interface IPeopleService
{
    [OperationContract]
    string GetData(int value);

    [OperationContract]
    PersonType GetPersonById(int id);
}

PeopleService.cs

public class PeopleService : IPeopleService, IDisposable
    {
        private ICollection<PersonType> People = new Collection<PersonType>
            {
                //...
            };
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }

        public PersonType GetPersonById(int id)
        {
            var person = People.First(p => p.Id == id);
            if (person!= null)
                return person;
            throw new InvalidDataException(string.Format("No Person with the id: {0} found.",id));
        }

        public void Dispose()
        {
            this.People = null;
        }
    }

app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

servicelibrary's app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service name="FreedomService.PeopleService">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8733/Design_Time_Addresses/FreedomService/basic/" />
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- Unless fully qualified, address is relative to base address supplied above -->
        <endpoint address="" binding="basicHttpBinding" contract="FreedomService.IPeopleService">
          <!-- 
              Upon deployment, the following identity element should be removed or replaced to reflect the 
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
              automatically.
          -->
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <!-- Metadata Endpoints -->
        <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. --> 
        <!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, 
          set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="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="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
Antarr Byrd
  • 24,863
  • 33
  • 100
  • 188

2 Answers2

10

tl;dr; Fix name in App.config

For me, this problem was triggered by ReSharper: I renamed the service and it had not renamed it everywhere.

Go into App.config to correct the service and interface names to fix the issue.

Ruskin
  • 5,721
  • 4
  • 45
  • 62
  • 1
    Haha, that's exactly what happens to me! Thank you very much. – D_S_toowhite Sep 21 '15 at 07:42
  • @Ruskin I don't understand. What do you mean by "Go INTO `App.config` to correct the service and interface names"? – Jessica Dec 05 '22 at 07:50
  • Hey @Jessica ... if I remember correctly from six years ago, I used ReSharper's rename functionality. It renamed all instances in code, but not the instance in the XML config file. Technology has moved on ... you'll likely be setting up your items using dependency injection or in startup.cs now. – Ruskin Dec 12 '22 at 02:40
0

I had the same issue.

My problem was missing the contract attribute

[ServiceContract] //System.ServiceModel.ServiceContract
public interface IPdaContract
{
Roberto B
  • 542
  • 5
  • 13