diff --git a/NewLife.Remoting/ApiClient.cs b/NewLife.Remoting/ApiClient.cs index bdb3c63..9e9d24f 100644 --- a/NewLife.Remoting/ApiClient.cs +++ b/NewLife.Remoting/ApiClient.cs @@ -6,6 +6,9 @@ using NewLife.Net; using NewLife.Remoting.Http; using NewLife.Threading; +#if !NET40 +using TaskEx = System.Threading.Tasks.Task; +#endif namespace NewLife.Remoting; @@ -186,7 +189,7 @@ protected virtual ICluster InitCluster() /// 服务操作 /// 参数 /// - public virtual TResult? Invoke(String action, Object? args = null) => Task.Run(() => InvokeAsync(action, args)).Result; + public virtual TResult? Invoke(String action, Object? args = null) => TaskEx.Run(() => InvokeAsync(action, args)).Result; /// 单向发送。同步调用,不等待返回 /// 服务操作 @@ -380,7 +383,7 @@ private void Client_Received(Object? sender, ReceivedEventArgs e) /// 连接后自动登录 /// 客户端 /// 强制登录 - protected virtual Task OnLoginAsync(ISocketClient client, Boolean force) => Task.FromResult(null); + protected virtual Task OnLoginAsync(ISocketClient client, Boolean force) => TaskEx.FromResult(null); /// 登录 /// diff --git a/NewLife.Remoting/ApiHttpServer.cs b/NewLife.Remoting/ApiHttpServer.cs index bb9e3fe..a2914c2 100644 --- a/NewLife.Remoting/ApiHttpServer.cs +++ b/NewLife.Remoting/ApiHttpServer.cs @@ -1,6 +1,7 @@ using NewLife.Http; using NewLife.Net; using NewLife.Remoting.Http; +using HttpCodec = NewLife.Remoting.Http.HttpCodec; namespace NewLife.Remoting; diff --git a/NewLife.Remoting/ApiNetServer.cs b/NewLife.Remoting/ApiNetServer.cs index 4989b79..6d66deb 100644 --- a/NewLife.Remoting/ApiNetServer.cs +++ b/NewLife.Remoting/ApiNetServer.cs @@ -3,6 +3,7 @@ using NewLife.Messaging; using NewLife.Net; using NewLife.Remoting.Http; +using HttpCodec = NewLife.Remoting.Http.HttpCodec; namespace NewLife.Remoting; diff --git a/NewLife.Remoting/Clients/WsChannel.cs b/NewLife.Remoting/Clients/WsChannel.cs index 2a35b72..5399471 100644 --- a/NewLife.Remoting/Clients/WsChannel.cs +++ b/NewLife.Remoting/Clients/WsChannel.cs @@ -2,6 +2,9 @@ using NewLife.Net; using NewLife.Remoting.Models; using NewLife.Serialization; +#if !NET40 +using TaskEx = System.Threading.Tasks.Task; +#endif namespace NewLife.Remoting.Clients; @@ -65,7 +68,7 @@ public virtual async Task ValidWebSocket(ApiHttpClient http) _websocket = client; _source = new CancellationTokenSource(); - _ = Task.Run(() => DoPull(client, _source.Token)); + _ = TaskEx.Run(() => DoPull(client, _source.Token)); } } diff --git a/NewLife.Remoting/Http/HttpEncoder.cs b/NewLife.Remoting/Http/HttpEncoder.cs index 7bc6d8b..c08784d 100644 --- a/NewLife.Remoting/Http/HttpEncoder.cs +++ b/NewLife.Remoting/Http/HttpEncoder.cs @@ -258,12 +258,12 @@ public virtual IMessage CreateResponse(IMessage msg, String action, Int32 code, p = url.IndexOf('?'); if (p > 0) { - message.Action = url[1..p]; - message.Data = url[(p + 1)..].GetBytes(); + message.Action = url.Substring(1, p - 1); + message.Data = url.Substring(p + 1).GetBytes(); } else { - message.Action = url[1..]; + message.Action = url.Substring(1); message.Data = http.Payload; } } @@ -279,7 +279,7 @@ public virtual IMessage CreateResponse(IMessage msg, String action, Int32 code, message.Action = uri.AbsolutePath; message.Data = http.Payload; } - if (message.Action.Length > 1) message.Action = message.Action[1..]; + if (message.Action.Length > 1) message.Action = message.Action.Substring(1); } return message; diff --git a/NewLife.Remoting/JsonEncoder.cs b/NewLife.Remoting/JsonEncoder.cs index f3294a3..318e8fa 100644 --- a/NewLife.Remoting/JsonEncoder.cs +++ b/NewLife.Remoting/JsonEncoder.cs @@ -95,7 +95,7 @@ public virtual Packet Encode(String action, Int32? code, Packet? value) public virtual IMessage CreateRequest(String action, Object? args) { // 二进制优先 - var (pk, str) = EncodeValue(args); + var pk = EncodeValue(args, out var str); if (Log != null && str.IsNullOrEmpty() && pk != null) str = $"[{pk?.Total}]"; WriteLog("{0}=>{1}", action, str); @@ -114,7 +114,7 @@ public virtual IMessage CreateRequest(String action, Object? args) public IMessage CreateResponse(IMessage msg, String action, Int32 code, Object? value) { // 编码响应数据包,二进制优先 - var (pk, str) = EncodeValue(value); + var pk = EncodeValue(value, out var str); if (Log != null && str.IsNullOrEmpty() && pk != null) str = $"[{pk?.Total}]"; WriteLog("{0}[{2:X2}]=>{1}", action, str, msg is DefaultMessage dm ? dm.Sequence : 0); @@ -129,9 +129,9 @@ public IMessage CreateResponse(IMessage msg, String action, Int32 code, Object? return rs; } - internal (Packet?, String) EncodeValue(Object? value) + internal Packet? EncodeValue(Object? value, out String str) { - var str = ""; + str = ""; Packet? pk = null; if (value != null) @@ -160,6 +160,6 @@ public IMessage CreateResponse(IMessage msg, String action, Int32 code, Object? } } - return (pk, str); + return pk; } } \ No newline at end of file diff --git a/NewLife.Remoting/NewLife.Remoting.csproj b/NewLife.Remoting/NewLife.Remoting.csproj index 2bf62e0..d8bf6fb 100644 --- a/NewLife.Remoting/NewLife.Remoting.csproj +++ b/NewLife.Remoting/NewLife.Remoting.csproj @@ -1,6 +1,6 @@  - net45;net461;netstandard2.0;netstandard2.1;net5.0;net6.0;net7.0;net8.0 + net40;net45;net461;netstandard2.0;netstandard2.1;net5.0;net6.0;net7.0;net8.0 协议通信库 提供高性能RPC客户端服务端,提供Http/WebSocket客户端服务端,提供应用级客户端 新生命开发团队 @@ -44,15 +44,18 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + + + + diff --git a/NewLife.Remoting/WsClient.cs b/NewLife.Remoting/WsClient.cs index 35990b3..4b4904e 100644 --- a/NewLife.Remoting/WsClient.cs +++ b/NewLife.Remoting/WsClient.cs @@ -1,4 +1,5 @@ -using System.Net.WebSockets; +#if !NET40 +using System.Net.WebSockets; using NewLife.Collections; using NewLife.Data; using NewLife.Log; @@ -442,4 +443,5 @@ private void DoWork(Object? state) WriteLog(msg); } #endregion -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/XUnitTest/JsonEncoderTests.cs b/XUnitTest/JsonEncoderTests.cs index 3d2d567..cc271dc 100644 --- a/XUnitTest/JsonEncoderTests.cs +++ b/XUnitTest/JsonEncoderTests.cs @@ -357,44 +357,44 @@ public void EncodeValue() { var value = new Packet(Rand.NextBytes(64)); - var (pk, str) = encoder.EncodeValue(value); + var pk = encoder.EncodeValue(value, out var str); Assert.Equal(value, pk); Assert.Empty(str); } { var value = Rand.NextBytes(64); - var (pk, str) = encoder.EncodeValue(value); + var pk = encoder.EncodeValue(value, out var str); Assert.Equal(value.ToHex(), pk.ToHex(64)); Assert.Empty(str); } { var value = new UserInfo2 { Name = "Stone", Age = 18 }; - var (pk, str) = encoder.EncodeValue(value); + var pk = encoder.EncodeValue(value, out var str); Assert.Equal(1 + value.Name.Length + 1, pk.Total); Assert.Empty(str); } { var value = DateTime.Now; - var (pk, str) = encoder.EncodeValue(value); + var pk = encoder.EncodeValue(value, out var str); Assert.Equal(value.ToFullString(), pk.ToStr()); Assert.Equal(value.ToFullString(), str); } { var value = 123.456d; - var (pk, str) = encoder.EncodeValue(value); + var pk = encoder.EncodeValue(value, out var str); Assert.Equal(value.ToString(), pk.ToStr()); Assert.Equal(value.ToString(), str); } { var value = new UserInfo { Name = "Stone", Age = 18 }; - var (pk, str) = encoder.EncodeValue(value); + var pk = encoder.EncodeValue(value, out var str); var json = value.ToJson(); Assert.Equal(json, pk.ToStr()); Assert.Equal(json, str); } { var value = new Exception("this is an error"); - var (pk, str) = encoder.EncodeValue(value); + var pk = encoder.EncodeValue(value, out var str); Assert.Equal(value.Message, pk.ToStr()); Assert.Equal(value.Message, str); }