diff --git a/Source/Csla.Shared/DataPortalClient/HttpProxy.cs b/Source/Csla.Shared/DataPortalClient/HttpProxy.cs index a755e71dde..c1010a10d5 100644 --- a/Source/Csla.Shared/DataPortalClient/HttpProxy.cs +++ b/Source/Csla.Shared/DataPortalClient/HttpProxy.cs @@ -1,5 +1,4 @@ -#if !NETFX_PHONE && !PCL259 || PCL46 -//----------------------------------------------------------------------- +//----------------------------------------------------------------------- // // Copyright (c) Marimer LLC. All rights reserved. // Website: http://www.lhotka.net/cslanet/ @@ -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; @@ -26,17 +23,11 @@ namespace Csla.DataPortalClient /// public class HttpProxy : IDataPortalProxy { - private int _timeoutInMilliseconds = 0; - /// /// Gets or sets the HttpClient timeout - /// in milliseconds (0 uses default HttpClient timeout). + /// in milliseconds (0 uses default HttpClient/WebClient timeout). /// - public int Timeout - { - get { return _timeoutInMilliseconds; } - set { _timeoutInMilliseconds = value; } - } + public int Timeout { get; set; } /// /// Gets or sets the default URL address @@ -86,22 +77,22 @@ public bool IsServerRemote /// public string DataPortalUrl { get; protected set; } - private static HttpClient _client; + private static HttpClient _httpClient; /// /// Gets an HttpClient object for use in /// communication with the server. /// - 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; } /// @@ -110,7 +101,16 @@ protected virtual HttpClient GetClient() /// HttpClient instance. public static void SetHttpClient(HttpClient client) { - _client = client; + _httpClient = client; + } + + /// + /// Gets an WebClient object for use in + /// communication with the server. + /// + protected virtual WebClient GetWebClient() + { + return new DefaultWebClient(this.Timeout); } /// @@ -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; } @@ -186,11 +177,6 @@ public async Task 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)) @@ -202,7 +188,7 @@ public async Task 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); @@ -248,11 +234,6 @@ public async Task 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)) @@ -264,7 +245,7 @@ public async Task 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); @@ -309,18 +290,13 @@ public async Task 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); @@ -366,11 +342,7 @@ public async Task 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)) @@ -382,7 +354,7 @@ public async Task 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); @@ -410,21 +382,18 @@ public async Task Delete(Type objectType, object criteria, Dat return result; } - private async Task CallDataPortalServer(HttpClient client, byte[] serialized, string operation, string routingToken, bool isSync) + private async Task 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 CallDataPortalServer(HttpClient client, byte[] serialized, string operation, string routingToken) + private async Task CallViaHttpClient(byte[] serialized, string operation, string routingToken) { + HttpClient client = GetHttpClient(); HttpRequestMessage httpRequest = null; httpRequest = new HttpRequestMessage( HttpMethod.Post, @@ -442,6 +411,23 @@ private async Task 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)) @@ -459,8 +445,6 @@ private string GetRoutingToken(Type objectType) return result; } -#region Extension Method for Requests - /// /// Override this method to manipulate the message /// request data sent to the server. @@ -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 \ No newline at end of file +} \ No newline at end of file