Skip to content

Commit

Permalink
feat: 新增ApiMessage表示请求响应报文
Browse files Browse the repository at this point in the history
  • Loading branch information
nnhy committed Sep 2, 2023
1 parent 2eff5f0 commit ad57001
Show file tree
Hide file tree
Showing 11 changed files with 435 additions and 394 deletions.
35 changes: 23 additions & 12 deletions NewLife.Remoting/ApiClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ public class ApiClient : ApiHost, IApiClient
/// <summary>最后活跃时间</summary>
public DateTime LastActive { get; set; }

/// <summary>收到服务端主动下发</summary>
public event EventHandler<ReceivedEventArgs> Received;
/// <summary>收到请求或响应时</summary>
public event EventHandler<ApiReceivedEventArgs> Received;

/// <summary>调用统计</summary>
public ICounter StatInvoke { get; set; }
Expand Down Expand Up @@ -272,16 +272,16 @@ public virtual async Task<TResult> InvokeWithClientAsync<TResult>(ISocketClient
if (resultType == typeof(IMessage)) return (TResult)rs;
//if (resultType == typeof(Packet)) return rs.Payload;

if (!enc.Decode(rs, out _, out var code, out var data)) throw new InvalidOperationException();
var message = enc.Decode(rs) ?? throw new InvalidOperationException();

// 是否成功
if (code is not 0 and not 200) throw new ApiException(code, data.ToStr()?.Trim('\"')) { Source = invoker + "/" + action };
if (message.Code is not 0 and not 200) throw new ApiException(message.Code, message.Data.ToStr()?.Trim('\"')) { Source = invoker + "/" + action };

if (data == null) return default;
if (resultType == typeof(Packet)) return (TResult)(Object)data;
if (message.Data == null) return default;
if (resultType == typeof(Packet)) return (TResult)(Object)message.Data;

// 解码结果
var result = enc.DecodeResult(action, data, rs);
var result = enc.DecodeResult(action, message.Data, rs);
if (resultType == typeof(Object)) return (TResult)result;

// 返回
Expand Down Expand Up @@ -341,18 +341,29 @@ private Int32 Invoke(Object session, String action, Object args, Byte flag = 0)
#region 异步接收
/// <summary>客户端收到服务端主动下发消息</summary>
/// <param name="message"></param>
protected virtual void OnReceive(IMessage message) { }
/// <param name="e"></param>
protected virtual void OnReceive(IMessage message, ApiReceivedEventArgs e)
{
Received?.Invoke(this, e);
}

private void Client_Received(Object sender, ReceivedEventArgs e)
{
LastActive = DateTime.Now;

Received?.Invoke(this, e);

// Api解码消息得到Action和参数
if (e.Message is not IMessage msg || msg.Reply) return;
if (e.Message is not IMessage msg) return;

var apiMessage = Encoder.Decode(msg);
var e2 = new ApiReceivedEventArgs
{
Remote = sender as ISocketRemote,
Message = msg,
ApiMessage = apiMessage,
UserState = e,
};

OnReceive(msg);
OnReceive(msg, e2);
}
#endregion

Expand Down
16 changes: 16 additions & 0 deletions NewLife.Remoting/ApiMessage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using NewLife.Data;

namespace NewLife.Remoting;

/// <summary>Api请求/响应</summary>
public class ApiMessage
{
/// <summary>动作</summary>
public String Action { get; set; }

/// <summary>响应码。请求没有该字段</summary>
public Int32 Code { get; set; }

/// <summary>数据。请求参数或响应内容</summary>
public Packet Data { get; set; }
}
24 changes: 24 additions & 0 deletions NewLife.Remoting/ApiReceivedEventArgs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@

using NewLife.Messaging;
using NewLife.Net;

namespace NewLife.Remoting;

/// <summary>收到Api请求或响应的事件参数</summary>
public class ApiReceivedEventArgs : EventArgs
{
/// <summary>会话</summary>
public IApiSession Session { get; set; }

/// <summary>远程连接</summary>
public ISocketRemote Remote { get; set; }

/// <summary>消息</summary>
public IMessage Message { get; set; }

/// <summary>请求响应报文</summary>
public ApiMessage ApiMessage { get; set; }

/// <summary>用户状态对象</summary>
public Object UserState { get; set; }
}
Loading

0 comments on commit ad57001

Please sign in to comment.