diff --git a/MADE.App.Networking/INetworkRequestManager.cs b/MADE.App.Networking/INetworkRequestManager.cs
new file mode 100644
index 00000000..4dcd93bb
--- /dev/null
+++ b/MADE.App.Networking/INetworkRequestManager.cs
@@ -0,0 +1,95 @@
+// --------------------------------------------------------------------------------------------------------------------
+//
+// Copyright (c) MADE Apps.
+//
+//
+// Defines an interface for a network request manager.
+//
+// --------------------------------------------------------------------------------------------------------------------
+
+namespace MADE.App.Networking
+{
+ using System;
+ using System.Collections.Concurrent;
+
+ using MADE.App.Networking.Requests;
+
+ ///
+ /// Defines an interface for a network request manager.
+ ///
+ public interface INetworkRequestManager
+ {
+ ///
+ /// Gets the current queue of network requests.
+ ///
+ ConcurrentDictionary CurrentQueue { get; }
+
+ ///
+ /// Starts the manager processing the queue of network requests at a default time period of 1 minute.
+ ///
+ void Start();
+
+ ///
+ /// Starts the manager processing the queue of network requests.
+ ///
+ ///
+ /// The time period between each process of the queue.
+ ///
+ void Start(TimeSpan processPeriod);
+
+ ///
+ /// Stops the processing of the network manager queues.
+ ///
+ void Stop();
+
+ ///
+ /// Adds or updates a network request in the queue.
+ ///
+ ///
+ /// The type of network request.
+ ///
+ ///
+ /// The expected response type.
+ ///
+ ///
+ /// The network request to execute.
+ ///
+ ///
+ /// The action to execute when receiving a successful response.
+ ///
+ void AddOrUpdate(TRequest request, Action successCallback)
+ where TRequest : NetworkRequest;
+
+ ///
+ /// Adds or updates a network request in the queue.
+ ///
+ ///
+ /// The type of network request.
+ ///
+ ///
+ /// The expected response type.
+ ///
+ ///
+ /// The expected error response type.
+ ///
+ ///
+ /// The network request to execute.
+ ///
+ ///
+ /// The action to execute when receiving a successful response.
+ ///
+ ///
+ /// The action to execute when receiving an error response.
+ ///
+ void AddOrUpdate(
+ TRequest request,
+ Action successCallback,
+ Action errorCallback)
+ where TRequest : NetworkRequest;
+
+ ///
+ /// Processes the current queue of network requests.
+ ///
+ void ProcessCurrentQueue();
+ }
+}
\ No newline at end of file
diff --git a/MADE.App.Networking/MADE.App.Networking.csproj b/MADE.App.Networking/MADE.App.Networking.csproj
new file mode 100644
index 00000000..19d0aad9
--- /dev/null
+++ b/MADE.App.Networking/MADE.App.Networking.csproj
@@ -0,0 +1,70 @@
+
+
+
+ netstandard2.0;uap10.0.16299
+
+
+
+ bin\Debug\netstandard2.0\MADE.App.Networking.xml
+
+
+
+ bin\Release\netstandard2.0\MADE.App.Networking.xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Docfx-$(TargetFramework).log
+ true
+ true
+ 1.0.0.0
+ MADE Apps
+ MADE Apps
+ MADE App Networking Library
+ Making App Development Easier with a collection of easy to use APIs for working with networking requests for .NET projects across Windows, Android, and iOS.
+ Copyright (C) MADE Apps. All rights reserved.
+ https://github.com/MADE-Apps/MADE-App-Components/blob/master/LICENSE
+ https://github.com/MADE-Apps/MADE-App-Components
+ https://github.com/MADE-Apps/MADE-App-Components
+ git
+ https://pbs.twimg.com/profile_images/927154020422160385/6HSRU36P_400x400.jpg
+ MADE App Development View Networking HttpClient Windows Android iOS Xamarin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/MADE.App.Networking/NetworkRequestManager.cs b/MADE.App.Networking/NetworkRequestManager.cs
new file mode 100644
index 00000000..75d3b1d2
--- /dev/null
+++ b/MADE.App.Networking/NetworkRequestManager.cs
@@ -0,0 +1,242 @@
+// --------------------------------------------------------------------------------------------------------------------
+//
+// Copyright (c) MADE Apps.
+//
+//
+// Defines a manager for executing queued network requests.
+//
+// --------------------------------------------------------------------------------------------------------------------
+
+namespace MADE.App.Networking
+{
+ using System;
+ using System.Collections.Concurrent;
+ using System.Collections.Generic;
+ using System.Linq;
+ using System.Threading;
+ using System.Threading.Tasks;
+
+ using MADE.App.Networking.Requests;
+
+ ///
+ /// Defines a manager for executing queued network requests.
+ ///
+ public sealed class NetworkRequestManager : INetworkRequestManager
+ {
+#if WINDOWS_UWP
+ private readonly Windows.UI.Xaml.DispatcherTimer processTimer;
+#else
+ private Timer processTimer;
+#endif
+
+ private bool isProcessingRequests;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public NetworkRequestManager()
+ {
+ this.CurrentQueue = new ConcurrentDictionary();
+
+#if WINDOWS_UWP
+ this.processTimer = new Windows.UI.Xaml.DispatcherTimer { Interval = TimeSpan.FromMinutes(1) };
+ this.processTimer.Tick += (sender, o) => this.ProcessCurrentQueue();
+#endif
+ }
+
+ ///
+ /// Gets the current queue of network requests.
+ ///
+ public ConcurrentDictionary CurrentQueue { get; }
+
+ ///
+ /// Starts the manager processing the queue of network requests at a default time period of 1 minute.
+ ///
+ public void Start()
+ {
+ this.Start(TimeSpan.FromMinutes(1));
+ }
+
+ ///
+ /// Starts the manager processing the queue of network requests.
+ ///
+ ///
+ /// The time period between each process of the queue.
+ ///
+ public void Start(TimeSpan processPeriod)
+ {
+#if WINDOWS_UWP
+ this.processTimer.Interval = processPeriod;
+
+ if (!this.processTimer.IsEnabled)
+ {
+ this.processTimer.Start();
+ }
+#else
+ if (this.processTimer == null)
+ {
+ this.processTimer = new Timer(
+ state => this.ProcessCurrentQueue(),
+ null,
+ TimeSpan.FromMinutes(0),
+ processPeriod);
+ }
+ else
+ {
+ this.processTimer.Change(TimeSpan.FromMinutes(0), processPeriod);
+ }
+#endif
+ }
+
+ ///
+ /// Stops the processing of the network manager queues.
+ ///
+ public void Stop()
+ {
+#if WINDOWS_UWP
+ if (this.processTimer.IsEnabled)
+ {
+ this.processTimer.Stop();
+ }
+#else
+ this.processTimer?.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);
+#endif
+ }
+
+ ///
+ /// Processes the current queue of network requests.
+ ///
+ public void ProcessCurrentQueue()
+ {
+ if (this.isProcessingRequests)
+ {
+ return;
+ }
+
+ if (this.CurrentQueue.Count > 0)
+ {
+ return;
+ }
+
+ this.isProcessingRequests = true;
+
+ try
+ {
+ CancellationTokenSource cts = new CancellationTokenSource();
+ List requestTasks = new List();
+ List requestCallbacks = new List();
+
+ while (this.CurrentQueue.Count > 0)
+ {
+ if (this.CurrentQueue.TryRemove(
+ this.CurrentQueue.FirstOrDefault().Key,
+ out NetworkRequestCallback request))
+ {
+ requestCallbacks.Add(request);
+ }
+ }
+
+ foreach (NetworkRequestCallback container in requestCallbacks)
+ {
+ requestTasks.Add(ExecuteRequestsAsync(this.CurrentQueue, container, cts));
+ }
+ }
+ finally
+ {
+ this.isProcessingRequests = false;
+ }
+ }
+
+ ///
+ /// Adds or updates a network request in the queue.
+ ///
+ ///
+ /// The type of network request.
+ ///
+ ///
+ /// The expected response type.
+ ///
+ ///
+ /// The network request to execute.
+ ///
+ ///
+ /// The action to execute when receiving a successful response.
+ ///
+ public void AddOrUpdate(TRequest request, Action successCallback)
+ where TRequest : NetworkRequest
+ {
+ this.AddOrUpdate(request, successCallback, null);
+ }
+
+ ///
+ /// Adds or updates a network request in the queue.
+ ///
+ ///
+ /// The type of network request.
+ ///
+ ///
+ /// The expected response type.
+ ///
+ ///
+ /// The expected error response type.
+ ///
+ ///
+ /// The network request to execute.
+ ///
+ ///
+ /// The action to execute when receiving a successful response.
+ ///
+ ///
+ /// The action to execute when receiving an error response.
+ ///
+ public void AddOrUpdate(
+ TRequest request,
+ Action successCallback,
+ Action errorCallback)
+ where TRequest : NetworkRequest
+ {
+ WeakReferenceCallback weakSuccessCallback = new WeakReferenceCallback(successCallback, typeof(TResponse));
+ WeakReferenceCallback weakErrorCallback = new WeakReferenceCallback(errorCallback, typeof(TErrorResponse));
+ NetworkRequestCallback requestCallback = new NetworkRequestCallback(
+ request,
+ weakSuccessCallback,
+ weakErrorCallback);
+
+ this.CurrentQueue.AddOrUpdate(
+ request.Identifier.ToString(),
+ requestCallback,
+ (s, callback) => requestCallback);
+ }
+
+ private static async Task ExecuteRequestsAsync(
+ ConcurrentDictionary queue,
+ NetworkRequestCallback requestCallback,
+ CancellationTokenSource cts)
+ {
+ if (cts.IsCancellationRequested)
+ {
+ queue.AddOrUpdate(
+ requestCallback.Request.Identifier.ToString(),
+ requestCallback,
+ (s, callback) => requestCallback);
+
+ return;
+ }
+
+ NetworkRequest request = requestCallback.Request;
+ WeakReferenceCallback successCallback = requestCallback.SuccessCallback;
+ WeakReferenceCallback errorCallback = requestCallback.ErrorCallback;
+
+ try
+ {
+ object response = await request.ExecuteAsync(successCallback.Type);
+ successCallback.Invoke(response);
+ }
+ catch (Exception ex)
+ {
+ successCallback.Invoke(Activator.CreateInstance(successCallback.Type));
+ errorCallback.Invoke(ex);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/MADE.App.Networking/Requests/Json/JsonDeleteNetworkRequest.cs b/MADE.App.Networking/Requests/Json/JsonDeleteNetworkRequest.cs
new file mode 100644
index 00000000..d48bfa87
--- /dev/null
+++ b/MADE.App.Networking/Requests/Json/JsonDeleteNetworkRequest.cs
@@ -0,0 +1,155 @@
+// --------------------------------------------------------------------------------------------------------------------
+//
+// Copyright (c) MADE Apps.
+//
+//
+// Defines a network request for a DELETE call with a JSON response.
+//
+// --------------------------------------------------------------------------------------------------------------------
+
+namespace MADE.App.Networking.Requests.Json
+{
+#if WINDOWS_UWP
+ using System;
+ using System.Collections.Generic;
+ using System.Threading;
+ using System.Threading.Tasks;
+
+ using Windows.Web.Http;
+
+ using Newtonsoft.Json;
+
+#else
+ using System;
+ using System.Collections.Generic;
+ using System.Net.Http;
+ using System.Threading;
+ using System.Threading.Tasks;
+
+ using Newtonsoft.Json;
+#endif
+
+ ///
+ /// Defines a network request for a DELETE call with a JSON response.
+ ///
+ public sealed class JsonDeleteNetworkRequest : NetworkRequest
+ {
+ private readonly HttpClient client;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ ///
+ /// The for executing the request.
+ ///
+ ///
+ /// The URL for the request.
+ ///
+ public JsonDeleteNetworkRequest(HttpClient client, string url)
+ : this(client, url, null)
+ {
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ ///
+ /// The for executing the request.
+ ///
+ ///
+ /// The URL for the request.
+ ///
+ ///
+ /// The additional headers.
+ ///
+ public JsonDeleteNetworkRequest(HttpClient client, string url, Dictionary headers)
+ : base(url, headers)
+ {
+ this.client = client ?? throw new ArgumentNullException(nameof(client));
+ }
+
+ ///
+ /// Executes the network request.
+ ///
+ ///
+ /// The cancellation token source.
+ ///
+ ///
+ /// The type of object returned from the request.
+ ///
+ ///
+ /// Returns the response of the request as the specified type.
+ ///
+ public override async Task ExecuteAsync(CancellationTokenSource cts = null)
+ {
+ string json = await this.GetJsonResponse(cts);
+ return JsonConvert.DeserializeObject(json);
+ }
+
+ ///
+ /// Executes the network request.
+ ///
+ ///
+ /// The type expected by the response of the request.
+ ///
+ ///
+ /// The cancellation token source.
+ ///
+ ///
+ /// Returns the response of the request as an object.
+ ///
+ public override async Task