Skip to content

Commit

Permalink
#1059 HttpProxy with HttpClient and WebClient support
Browse files Browse the repository at this point in the history
  • Loading branch information
rockfordlhotka committed Apr 4, 2019
1 parent 60de08d commit 11b6f13
Showing 1 changed file with 65 additions and 66 deletions.
131 changes: 65 additions & 66 deletions Source/Csla.Shared/DataPortalClient/HttpProxy.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#if !NETFX_PHONE && !PCL259 || PCL46
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
// <copyright file="HttpProxy.cs" company="Marimer LLC">
// Copyright (c) Marimer LLC. All rights reserved.
// Website: http://www.lhotka.net/cslanet/
Expand All @@ -9,12 +8,10 @@
using Csla.Core;
using Csla.Serialization.Mobile;
using Csla.Server;
using Csla.Threading;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

Expand All @@ -26,17 +23,11 @@ namespace Csla.DataPortalClient
/// </summary>
public class HttpProxy : IDataPortalProxy
{
private int _timeoutInMilliseconds = 0;

/// <summary>
/// Gets or sets the HttpClient timeout
/// in milliseconds (0 uses default HttpClient timeout).
/// in milliseconds (0 uses default HttpClient/WebClient timeout).
/// </summary>
public int Timeout
{
get { return _timeoutInMilliseconds; }
set { _timeoutInMilliseconds = value; }
}
public int Timeout { get; set; }

/// <summary>
/// Gets or sets the default URL address
Expand Down Expand Up @@ -86,22 +77,22 @@ public bool IsServerRemote
/// </summary>
public string DataPortalUrl { get; protected set; }

private static HttpClient _client;
private static HttpClient _httpClient;

/// <summary>
/// Gets an HttpClient object for use in
/// communication with the server.
/// </summary>
protected virtual HttpClient GetClient()
protected virtual HttpClient GetHttpClient()
{
if (_client == null) {
_client = new HttpClient();
if (_httpClient == null) {
_httpClient = new HttpClient();
if (this.Timeout > 0) {
_client.Timeout = TimeSpan.FromMilliseconds(this.Timeout);
_httpClient.Timeout = TimeSpan.FromMilliseconds(this.Timeout);
}
}

return _client;
return _httpClient;
}

/// <summary>
Expand All @@ -110,7 +101,16 @@ protected virtual HttpClient GetClient()
/// <param name="client">HttpClient instance.</param>
public static void SetHttpClient(HttpClient client)
{
_client = client;
_httpClient = client;
}

/// <summary>
/// Gets an WebClient object for use in
/// communication with the server.
/// </summary>
protected virtual WebClient GetWebClient()
{
return new DefaultWebClient(this.Timeout);
}

/// <summary>
Expand Down Expand Up @@ -155,17 +155,8 @@ private Csla.Server.Hosts.HttpChannel.UpdateRequest GetBaseUpdateCriteriaRequest
{
request.Principal = MobileFormatter.Serialize(ApplicationContext.User);
}
#if NETCORE || PCL46 || PCL259
request.ClientCulture = System.Globalization.CultureInfo.CurrentCulture.Name;
request.ClientUICulture = System.Globalization.CultureInfo.CurrentUICulture.Name;
#elif NETFX_CORE || NETFX_PHONE
var language = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Languages[0];
request.ClientCulture = language;
request.ClientUICulture = language;
#else
request.ClientCulture = Thread.CurrentThread.CurrentCulture.Name;
request.ClientUICulture = Thread.CurrentThread.CurrentUICulture.Name;
#endif
return request;
}

Expand All @@ -186,11 +177,6 @@ public async Task<DataPortalResult> Create(Type objectType, object criteria, Dat
DataPortalResult result = null;
try
{
#if NET40
if (isSync)
throw new NotSupportedException("isSync == true");
#endif
var client = GetClient();
var request = GetBaseCriteriaRequest();
request.TypeName = AssemblyNameTranslator.GetAssemblyQualifiedName(objectType.AssemblyQualifiedName);
if (!(criteria is IMobileObject))
Expand All @@ -202,7 +188,7 @@ public async Task<DataPortalResult> Create(Type objectType, object criteria, Dat

var serialized = MobileFormatter.Serialize(request);

serialized = await CallDataPortalServer(client, serialized, "create", GetRoutingToken(objectType), isSync);
serialized = await CallDataPortalServer(serialized, "create", GetRoutingToken(objectType), isSync);

var response = (Csla.Server.Hosts.HttpChannel.HttpResponse)MobileFormatter.Deserialize(serialized);
response = ConvertResponse(response);
Expand Down Expand Up @@ -248,11 +234,6 @@ public async Task<DataPortalResult> Fetch(Type objectType, object criteria, Data
DataPortalResult result = null;
try
{
#if NET40
if (isSync)
throw new NotSupportedException("isSync == true");
#endif
var client = GetClient();
var request = GetBaseCriteriaRequest();
request.TypeName = AssemblyNameTranslator.GetAssemblyQualifiedName(objectType.AssemblyQualifiedName);
if (!(criteria is IMobileObject))
Expand All @@ -264,7 +245,7 @@ public async Task<DataPortalResult> Fetch(Type objectType, object criteria, Data

var serialized = MobileFormatter.Serialize(request);

serialized = await CallDataPortalServer(client, serialized, "fetch", GetRoutingToken(objectType), isSync);
serialized = await CallDataPortalServer(serialized, "fetch", GetRoutingToken(objectType), isSync);

var response = (Csla.Server.Hosts.HttpChannel.HttpResponse)MobileFormatter.Deserialize(serialized);
response = ConvertResponse(response);
Expand Down Expand Up @@ -309,18 +290,13 @@ public async Task<DataPortalResult> Update(object obj, DataPortalContext context
DataPortalResult result = null;
try
{
#if NET40
if (isSync)
throw new NotSupportedException("isSync == true");
#endif
var client = GetClient();
var request = GetBaseUpdateCriteriaRequest();
request.ObjectData = MobileFormatter.Serialize(obj);
request = ConvertRequest(request);

var serialized = MobileFormatter.Serialize(request);

serialized = await CallDataPortalServer(client, serialized, "update", GetRoutingToken(obj.GetType()), isSync);
serialized = await CallDataPortalServer(serialized, "update", GetRoutingToken(obj.GetType()), isSync);

var response = (Csla.Server.Hosts.HttpChannel.HttpResponse)MobileFormatter.Deserialize(serialized);
response = ConvertResponse(response);
Expand Down Expand Up @@ -366,11 +342,7 @@ public async Task<DataPortalResult> Delete(Type objectType, object criteria, Dat
DataPortalResult result = null;
try
{
#if NET40
if (isSync)
throw new NotSupportedException("isSync == true");
#endif
var client = GetClient();

var request = GetBaseCriteriaRequest();
request.TypeName = AssemblyNameTranslator.GetAssemblyQualifiedName(objectType.AssemblyQualifiedName);
if (!(criteria is IMobileObject))
Expand All @@ -382,7 +354,7 @@ public async Task<DataPortalResult> Delete(Type objectType, object criteria, Dat

var serialized = MobileFormatter.Serialize(request);

serialized = await CallDataPortalServer(client, serialized, "delete", GetRoutingToken(objectType), isSync);
serialized = await CallDataPortalServer(serialized, "delete", GetRoutingToken(objectType), isSync);

var response = (Csla.Server.Hosts.HttpChannel.HttpResponse)MobileFormatter.Deserialize(serialized);
response = ConvertResponse(response);
Expand Down Expand Up @@ -410,21 +382,18 @@ public async Task<DataPortalResult> Delete(Type objectType, object criteria, Dat
return result;
}

private async Task<byte[]> CallDataPortalServer(HttpClient client, byte[] serialized, string operation, string routingToken, bool isSync)
private async Task<byte[]> CallDataPortalServer(byte[] serialized, string operation, string routingToken, bool isSync)
{
//var task = CallDataPortalServer(client, serialized, operation, routingToken);
#if !NET40
if (isSync)
Task.Run(async () =>
serialized = await CallDataPortalServer(client, serialized, operation, routingToken)).Wait();
serialized = CallViaWebClient(serialized, operation, routingToken);
else
#endif
serialized = await CallDataPortalServer(client, serialized, operation, routingToken);
serialized = await CallViaHttpClient(serialized, operation, routingToken);
return serialized;
}

private async Task<byte[]> CallDataPortalServer(HttpClient client, byte[] serialized, string operation, string routingToken)
private async Task<byte[]> CallViaHttpClient(byte[] serialized, string operation, string routingToken)
{
HttpClient client = GetHttpClient();
HttpRequestMessage httpRequest = null;
httpRequest = new HttpRequestMessage(
HttpMethod.Post,
Expand All @@ -442,6 +411,23 @@ private async Task<byte[]> CallDataPortalServer(HttpClient client, byte[] serial
return serialized;
}

private byte[] CallViaWebClient(byte[] serialized, string operation, string routingToken)
{
WebClient client = GetWebClient();
var url = $"{DataPortalUrl}?operation={CreateOperationTag(operation, ApplicationContext.VersionRoutingTag, routingToken)}";
if (UseTextSerialization)
{
var result = client.UploadString(url, System.Convert.ToBase64String(serialized));
serialized = System.Convert.FromBase64String(result);
}
else
{
var result = client.UploadData(url, serialized);
serialized = result;
}
return serialized;
}

private string CreateOperationTag(string operatation, string versionToken, string routingToken)
{
if (!string.IsNullOrWhiteSpace(versionToken) || !string.IsNullOrWhiteSpace(routingToken))
Expand All @@ -459,8 +445,6 @@ private string GetRoutingToken(Type objectType)
return result;
}

#region Extension Method for Requests

/// <summary>
/// Override this method to manipulate the message
/// request data sent to the server.
Expand Down Expand Up @@ -491,7 +475,22 @@ protected virtual Csla.Server.Hosts.HttpChannel.HttpResponse ConvertResponse(Csl
return response;
}

#endregion
private class DefaultWebClient : WebClient
{
private int Timeout { get; set; }

public DefaultWebClient(int timeout)
{
Timeout = timeout;
}

protected override WebRequest GetWebRequest(Uri address)
{
var req = base.GetWebRequest(address);
if (Timeout > 0)
req.Timeout = Timeout;
return req;
}
}
}
}
#endif
}

0 comments on commit 11b6f13

Please sign in to comment.