JSON service with WPF

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                       
comments powered by Disqus