WCF Self Host Service - Endpoints in C#
- by Kyle
My first few attempts at creating a self hosted service. Trying to make something up which will accept a query string and return some text but have have a few issues:
All the documentation talks about endpoints being created automatically for each base address if they are not found in a config file. This doesn't seem to be the case for me, I get the "Service has zero application endpoints..." exception. Manually specifying a base endpoint as below seems to resolve this:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace TestService
{
[ServiceContract]
public interface IHelloWorldService
{
[OperationContract]
string SayHello(string name);
}
public class HelloWorldService : IHelloWorldService
{
public string SayHello(string name)
{
return string.Format("Hello, {0}", name);
}
}
class Program
{
static void Main(string[] args)
{
string baseaddr = "http://localhost:8080/HelloWorldService/";
Uri baseAddress = new Uri(baseaddr);
// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
// Enable metadata publishing.
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);
host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr + "SayHello");
//for some reason a default endpoint does not get created here
host.Open();
Console.WriteLine("The service is ready at {0}", baseAddress);
Console.WriteLine("Press to stop the service.");
Console.ReadLine();
// Close the ServiceHost.
host.Close();
}
}
}
}
I still think I'm doing something wrong as I don't get the normal "This is a web service...etc..." page when I load up the url
How would I go about setting this up to return the value of name in SayHello(string name) when requested thusly: localhost:8080/HelloWorldService/SayHello?name=kyle
Do I have to create an endpoing for the SayHello contract as well?
I'm trying to walk before running, but this just seems like crawling...Service has zero application endpoints...