Cannot start wcf service host
Asked Answered
S

2

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>
Sweeny answered 7/6, 2013 at 17:29 Comment(10)
The class PeopleService will handle the execution. I assume it is an Interface that has a ServiceContract Attribute with a member that has an OperationContract?Heidi
@Executor I've add the source for the service aboveSweeny
@AntarrByrd I'm assuming it fails at host.Open() ?Gyatt
Also, what does your app.config file look like?Gyatt
@MikeC it does not fail at host.Open(), the consoles prints out just as expected and remains openSweeny
@MikeC app.config <?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration>Sweeny
@Antarr Then where do you actually even see the error you're talkinga bout?Gyatt
@MikeC when I click on the WCFServiceHost icon on my taskbarSweeny
"It works on my machine (TM)". Provided I run Visual Studio as Admin.Squirrel
@MikeC I managed to get it to work now, for the service. There was a problem with the services app.config. But the console host endpoints do not work, ie. localhost:8080Sweeny
M
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.

Microorganism answered 15/8, 2014 at 10:26 Comment(3)
Haha, that's exactly what happens to me! Thank you very much.Briggs
@Microorganism I don't understand. What do you mean by "Go INTO App.config to correct the service and interface names"?Firearm
Hey @Firearm ... 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.Microorganism
T
0

I had the same issue.

My problem was missing the contract attribute

[ServiceContract] //System.ServiceModel.ServiceContract
public interface IPdaContract
{
Tricho answered 29/9, 2015 at 8:53 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.