This post was originally published on Coding Glamour.

Een API is geen API als er niet via verschillende protocollen tegenaan gepraat kan worden; iets wat in WCF volledig in config geregeld kan worden. In Visual Studio 2008 nog iets wat haast automatisch handwerk werd: de Configuration Editor was niet alleen alles behalve intuitief, maar genereerde ook nogal eens niet werkende configs. 2010 heeft daar echter verbeteringen in aangebracht, waardoor het configureren voor meerdere endpoints een breeze is. Service
We gaan uit van de volgende service:

    [ServiceContract]
    public interface IDemoService
    {
        [OperationContract]
        [WebGet]
        SomeContract GetData(string id);
    }
    public class DemoService : IDemoService
    {
        public SomeContract GetData (string id)
        {
            return new SomeContract(id);
        }
    }
    [DataContract]
    public class SomeContract
    {
        private readonly string _id;
        public SomeContract(string id)
        {
            _id = id;
        }
        [DataMember]
        public string Hoi { 
            get { return "Jan" + _id;  } 
            set { }
        }
    }


Endpoints?
Voor een standaard WCF API die SOAP en REST ondersteunt zijn er 2 endpoints nodig. Een endpoint is een adres waarop de service kan reageren volgens een bepaalde configuratieset. De endpoints in dit geval zijn:
  • rest, een webHttpBinding die luistert op adres '' (leeg)
  • soap, een basicHttpBinding die luistert op adres 'soap'
De 'soap' binding biedt een WSDL aan om te gebruiken door andere platformen.

Configureren
In je project kies voor 'Tools' -> 'WCF Configuration Editor', en selecteer je web.config-file onder 'File' -> 'Open' -> 'Config file'. Als je op 'Services' klikt zie je dat er standaard al een aantal endpoints zijn aangemaakt. Verwijder deze allemaal met de 'Delete' button.
http://www.100procentjan.nl/tweakers/wcf_endpoints1.png

Behavior aanmaken
Allereerst maken we een 'behavior' aan, een set regels waar de service zich aan moet houden. Hier kunnen we instellen dat de service via HTTP te benaderen is. Nodig om de service beschikbaar te maken via REST.
http://www.100procentjan.nl/tweakers/wcf_endpoints2.png

Eerste endpoint toevoegen: REST
Wanneer je nu op de folder 'Services' klikt, kies voor 'Create a New Service Endpoint'. Je komt vervolgens in een wizard terecht.

1. Selecteer allereerst de DLL van je service, en direct daarna de type:
http://www.100procentjan.nl/tweakers/wcf_endpoints1.png

2. Kies bij 'What communication mode is your service using' voor 'HTTP'.

3. Kies bij 'What method of interoperability do you want to use' voor 'Basic Web Services interoperability'

4. Voer bij 'What is the address of your endpoint' niets in:
http://www.100procentjan.nl/tweakers/wcf_endpoints4.png

5. Het eerste endpoint is aangemaakt. Verander de volgende settings:
http://www.100procentjan.nl/tweakers/wcf_endpoints5.png

Voila. Wanneer je nu build is je service beschikbaar onder:
http://localhost:POORT/DemoService.wcf/getdata?id=1
http://www.100procentjan.nl/tweakers/wcf_endpoints6.png

Tweede endpoint toevoegen: SOAP
Voor het toevoegen van je 'SOAP' endpoint, kies je weer voor 'Create a New Service Endpoint'. Druk steeds op 'Next >' behalve bij 'Address'. Voer hier 'soap' in. C'est soit.
http://www.100procentjan.nl/tweakers/wcf_endpoints7.png

Voor some reason kiest WCF er soms voor om '<identity/>' secties in je web.config te zetten. Deze zijn voor een publieke API niet nodig, als je hier een fout over krijgt; verwijder dan secties die er uit zien als:

          <identity>
            <certificateReference storeName="My" storeLocation="LocalMachine"
              x509FindType="FindBySubjectDistinguishedName" />
          </identity>


Je SOAP service is nu beschikbaar onder: 'http://localhost:POORT/DemoService.wcf?wsdl', en is direct bruikbaar vanuit elk ander platform dat een SOAP client beschikbaar heeft!

REST ook via JSON beschikbaar maken
Met de huidige config is de service alleen via XML beschikbaar. We kunnen echter met 'behaviors' de service ook via JSON beschikbaar maken. Maak onder 'Endpoint Behaviors' de volgende behavior aan:
http://www.100procentjan.nl/tweakers/wcf_endpoints8.png

Wanneer je nu het volgende endpoint toevoegt, is je service ook beschikbaar als JSON service:
http://www.100procentjan.nl/tweakers/wcf_endpoints9.png

De service is benaderbaar via: http://localhost:POORT/DemoService.wcf/json/getdata?id=1
http://www.100procentjan.nl/tweakers/wcf_endpoints10.png

Et voila
In een paar minuten is je WCF service benaderbaar via XML, JSON en SOAP. Wanneer je bijvoorbeeld een NetTcpBinding (voor snelheid, reliability, noem iets) wil toevoegen, kan je gebruik maken van dezelfde stappen.