Zuma Lifeguard Wiki
Advertisement

WebAPI / Web API examples

Windows Service hosting WebAPI[]

1.[]

To support Windows Authorization, use NtlmSelfHostConfiguration instead of HttpSelfHostConfiguration

using System;
using System.Web.Http.SelfHost.Channels;
using System.ServiceProcess;
using System.Web.Http;
using System.Web.Http.SelfHost;
using System.ServiceModel.Channels;
using System.ServiceModel;

    public class NtlmSelfHostConfiguration : HttpSelfHostConfiguration
    {
        public NtlmSelfHostConfiguration(string baseAddress)
            : base(baseAddress)
        { }

        public NtlmSelfHostConfiguration(Uri baseAddress)
            : base(baseAddress)
        { }

        protected override BindingParameterCollection OnConfigureBinding(System.Web.Http.SelfHost.Channels.HttpBinding httpBinding)
        {
            httpBinding.Security.Mode = HttpBindingSecurityMode.TransportCredentialOnly;
            httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
            return base.OnConfigureBinding(httpBinding);
        }
    }


    public partial class AudioConverterTool : ServiceBase
    {
        NtlmSelfHostConfiguration _config;
        HttpSelfHostServer _server;
        private System.Diagnostics.EventLog _audioToolEventLog;

        public static AudioConverterTool Single { get; set; }

        public AudioConverterTool()
        {
            Single = this;

            InitializeComponent();

            // Logging events.
            if (!System.Diagnostics.EventLog.SourceExists("AudioToolSource"))
            {
                System.Diagnostics.EventLog.CreateEventSource(
                   "AudioToolSource", "AudioToolService");
            }
            _audioToolEventLog.Source = "AudioToolSource";
            _audioToolEventLog.Log = "AudioToolService";

            // Setting SelfHosted WebAPI
// You need to have appconfig section in your App.Config file:
/*
  <appSettings>
    <add key="ListeningURL_ServiceAddress" value="http://localhost:8080"></add>
  </appSettings>
*/
            var ServiceAddress = System.Configuration.ConfigurationManager.AppSettings["ListeningURL_ServiceAddress"];

            _audioToolEventLog.WriteEntry(string.Format("NtlmSelfHostConfiguration: Service Address: {0}", ServiceAddress));

            _config = new NtlmSelfHostConfiguration(ServiceAddress);
            // Set the max message size to 10M instead of the default size of 64k and also
            // set the transfer mode to 'streamed' so that don't allocate a 1M buffer but 
            // rather just have a small read buffer.
            _config.MaxReceivedMessageSize = 10 * 1024 * 1024;
            _config.TransferMode = TransferMode.Streamed;

            _config.Routes.MapHttpRoute(
                "API Default", "api/{controller}/{id}",
                new { id = RouteParameter.Optional });

            _audioToolEventLog.WriteEntry("WebAPI Routes Mapped");
        }

        protected override void OnStart(string[] args)
        {
            _audioToolEventLog.WriteEntry("Audio Tool Service - Starting...");

            this.RequestAdditionalTime(300000);

            _server = new HttpSelfHostServer(_config);

            _audioToolEventLog.WriteEntry("Opening Async connection");
            _server.OpenAsync();

            _audioToolEventLog.WriteEntry("Audio Tool Service - Started");
        }

        protected override void OnStop()
        {
            _audioToolEventLog.WriteEntry("Audio Tool Service - Stopping");

            _audioToolEventLog.WriteEntry("Closing Async connection");
            _server.CloseAsync().Wait();

            _audioToolEventLog.WriteEntry("Closed");
            _server.Dispose();

            _audioToolEventLog.WriteEntry("Audio Tool Service - Stopped");
        }

        protected override void OnContinue()
        {
            _audioToolEventLog.WriteEntry("Audio Tool Service - Continuing...");
        }

        protected override void OnPause()
        {
            _audioToolEventLog.WriteEntry("Audio Tool Service - Pausing...");
        }

        protected override void OnShutdown()
        {
            _audioToolEventLog.WriteEntry("Audio Tool Service - Shutting down...");
        }
    }

    public class NtlmSelfHostConfiguration : HttpSelfHostConfiguration
    {
        public NtlmSelfHostConfiguration(string baseAddress)
            : base(baseAddress)
        { }

        public NtlmSelfHostConfiguration(Uri baseAddress)
            : base(baseAddress)
        { }

        protected override BindingParameterCollection OnConfigureBinding(System.Web.Http.SelfHost.Channels.HttpBinding httpBinding)
        {
            httpBinding.Security.Mode = HttpBindingSecurityMode.TransportCredentialOnly;
            httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
            return base.OnConfigureBinding(httpBinding);
        }
    }

    partial class AudioConverterTool
    {
        /// <summary> 
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
    }

2.[]

using System;
using System.Net;
using System.Web.Http;

    [Authorize]
    public class ProductsController : ApiController
    {
        [HttpPost]
        public string Post(Newtonsoft.Json.Linq.JObject value)
        {
            try
            {
                string userName = base.User.Identity.Name;

                var audioFile = value.ToObject<AudioFile>();

                var audioAudioFile = CallSomeBusinessLogicToConvert(audioFile);

                var jo = Newtonsoft.Json.Linq.JObject.FromObject(audioFile);
                return jo.ToString();
            }
            catch (Exception e)
            {
                Program.Log(e.ToString());
                return "";
            }
        }

    public class AudioFile
    {
        public string Filename { get; set; }
        public byte[] FileContents { get; set; }
    }

Console client consuming WebAPI[]

3.[]

    class Program
    {
        static HttpClient client = new HttpClient();

        static void Main(string[] args)
        {
            var audioFile = new SecureAudio.AudioFile();

	// change this to whatever file you want to load.
            audioFile.Filename = "toad.png";
            audioFile.FileContents = File.ReadAllBytes(@"e:\temp\toad.png");

            string URI = "http://localhost:8080/api/products";

            Post(audioFile, URI);

            Console.WriteLine("Press Enter to quit.");
            Console.ReadLine();
        }

        private static void Post(SecureAudio.AudioFile audioFile, string URI)
        {
            using (WebClient wc = new WebClient())
            {
                wc.Headers[HttpRequestHeader.ContentType] = "application/json";
                wc.UseDefaultCredentials = true;

                var jo = Newtonsoft.Json.Linq.JObject.FromObject(audioFile);

                var rawResponse = wc.UploadData(URI, Encoding.Default.GetBytes(jo.ToString()));

                var sResponse = System.Text.Encoding.Default.GetString(rawResponse);
                var s = Regex.Unescape(sResponse).Trim('"');
                var jo2 = Newtonsoft.Json.Linq.JObject.Parse(s);
                var audioFile2 = jo2.ToObject<SecureAudio.AudioFile>();

                File.WriteAllBytes(@"e:\xx2.png", audioFile2.FileContents);
            }
        }
    }
Advertisement