This is a code overview for creating a WPF endpoint that sends and receives JSON data.

Assemblies references


Configure the endpoint

You can configure in the web.config your service endpoing by doing the following:

        <service name="Listmill.Hub.WebDaemon.IISAdminEndpoint">
            <endpoint address="http://localhost:8000/myservice/" binding="webHttpBinding" contract="Listmill.Hub.WebDaemon.IIISAdminEndpoint" />

Alternatively, you can programmatical set up your endpoint by doing the following:

var port = 8000;
var address = string.Format("http://localhost:{0}/Supervisor", port);
var binding = new WebHttpBinding();

var host = new ServiceHost(this);
var endpoint = host.AddServiceEndpoint(typeof(ISupervisorEndpoint), binding, address);
endpoint.EndpointBehaviors.Add(new WebHttpBehavior());

Creating the Service Contract

You can create your contact in the traditional way. The implementation will require the use of WebInvoke attribute on the methods.

[ServiceContract(Namespace = "http://Listmill.Hub.WebDaemon")]
public interface IIISAdminEndpoint
  int AddSite(string sitekey);

public class IISAdminEndpoint : IIISAdminEndpoint
    [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    public int AddSite(string sitekey)
        // do some stuff

Making Requests

You can make a request to the service using a traditional HttpWebRequest. Serialize an object to a JSON string using JavaScriptSerializer and pass the string as the POST data to your request.

// create your request and serialize an object into the request
var serializer = new JavaScriptSerializer();
var json = serializer.Serialize(new { sitekey = site.SiteKey });
var jsonBytes = Encoding.UTF8.GetBytes(json);
var requestUrl = string.Format("http://{0}:{1}/iisadmin/addsite", webserver.IPAddress, 8000);
var request = (HttpWebRequest)WebRequest.Create(requestUrl);
request.Method = "POST";
request.ContentLength = jsonBytes.Length;
request.ContentType = "application/json";
using (var stream = request.GetRequestStream())
    stream.Write(jsonBytes, 0, jsonBytes.Length);

// handle the response
using (var response = request.GetResponse())
using (var responseStream = response.GetResponseStream())
using (var streamReader = new StreamReader(responseStream))
    var result = streamReader.ReadToEnd();
    // do something with the result