提交代码

This commit is contained in:
zpc 2024-11-22 04:23:23 +08:00
parent c48d7fd34d
commit 93c27b5c55
4 changed files with 173 additions and 111 deletions

View File

@ -37,10 +37,10 @@ namespace CloudGaming.Code.Game
/// <returns></returns>
public async Task<string> GetTokenAsync(RequestBaseModel requestBaseModel)
{
//if (_UserId == 0)
//{
// throw MessageBox.ErrorShow("请先登录");
//}
if (_UserId == 0)
{
throw MessageBox.ErrorShow("请先登录");
}
if (string.IsNullOrEmpty(requestBaseModel.Sn))
{
throw MessageBox.ErrorShow("设备号不能为空");
@ -48,6 +48,7 @@ namespace CloudGaming.Code.Game
//requestBaseModel.Sn = Guid.NewGuid().ToString();
JYRequestParameter requestParameter = new JYRequestParameter(requestBaseModel.Sn, _UserId);
var data = await JYApi.GetToken(requestParameter);
//Console.WriteLine(data.TotalMilliseconds);
if (data.IsSuccess)
{
return data?.Data?.Token ?? "";
@ -78,6 +79,7 @@ namespace CloudGaming.Code.Game
}
var gameId = playGameRequest.GameId;
var modelName = playGameRequest.ModelName;
var cpu = playGameRequest.Cpu;
var userGame = await Dao.DaoPhone.Context.T_User_GameList.Where(it => (it.Status == (int)PlayGameStatus. || it.Status == (int)PlayGameStatus.) && it.UserId == _UserId).FirstOrDefaultAsync();
if (userGame != null && userGame.Status == (int)PlayGameStatus.)
{
@ -104,6 +106,7 @@ namespace CloudGaming.Code.Game
playGameSettings.HangUpTimer = 60 * 5;
playGameSettings.ModelName = modelName;
playGameSettings.StartResolution = "1080P";
playGameRequest.Cpu = cpu;
var data = await JYApi.PlayGame(playGameSettings);
T_User_GameList t_User_GameList = new T_User_GameList()
{
@ -116,9 +119,34 @@ namespace CloudGaming.Code.Game
UpdateTime = DateTime.Now,
UserId = _UserId,
};
T_User_GameLog t_User_GameLog = new T_User_GameLog()
{
Cpu = cpu,
CreateTime = DateTime.Now,
DisplayGrade = 0,
GameId = gameId,
Gamekey = gameInfo.GameCloudId,
IP = this.HttpContextAccessor.HttpContext.GetClientIpAddress(),
ModelName = modelName,
PlayQueueId = 0,
PlayQueueStatus = 0,
QueueGrade = 0,
ScId = "",
Status = 0,
UpdateTime = DateTime.Now,
UserId = _UserId,
UserKey = "",
};
T_User_PlayGmaeLog playGmaeLog = new T_User_PlayGmaeLog()
{
CreateTime = DateTime.Now,
DescribeContent = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}用户启动游戏;",
GameId = gameId,
UserId = _UserId,
};
if (data.IsLineUp)
{
playGmaeLog.DescribeContent += $"用户开始排队;";
t_User_GameList.Status = (int)PlayGameStatus.;
await Dao.DaoPhone.Context.AddAsync(t_User_GameList);
await Dao.DaoPhone.Context.SaveChangesAsync();
@ -126,10 +154,12 @@ namespace CloudGaming.Code.Game
}
else if (data.IsSuccess)
{
playGmaeLog.DescribeContent += $"用户启动游戏成功;";
await Dao.DaoPhone.Context.AddAsync(t_User_GameList);
await Dao.DaoPhone.Context.SaveChangesAsync();
return new BaseResponse<object>(ResponseCode.Success, "", data.Data);
}
playGmaeLog.DescribeContent += $"用户游戏启动失败;";
return new BaseResponse<object>(ResponseCode.Error, data.Msg, data.Data);
}

View File

@ -6,7 +6,7 @@ using System.Text;
namespace CloudGaming.Code.JY;
/// <summary>
///
/// JYAPI请求处理器
/// </summary>
public class JYApiHandler : DelegatingHandler
{
@ -14,69 +14,135 @@ public class JYApiHandler : DelegatingHandler
public JYApiHandler(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
/// <summary>
/// 发送请求的核心处理方法
/// </summary>
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// 访问 HttpContext
var httpContext = _httpContextAccessor.HttpContext;
var host = httpContext.Request.Host.Host;
var app = AppConfigurationExtend.GetAppConfig(host);
if (app != null)
try
{
var newUri = new Uri(new Uri(app.GameConfig.BsUrl), request.RequestUri.PathAndQuery);
var httpContext = _httpContextAccessor.HttpContext;
if (httpContext == null)
throw new InvalidOperationException("无法获取HttpContext。");
// 更新请求的 URI
request.RequestUri = newUri;
// 处理请求体
if (request.Content is FormUrlEncodedContent)
var host = httpContext.Request.Host.Host;
var app = AppConfigurationExtend.GetAppConfig(host);
if (app != null)
{
var formData = await request.Content.ReadAsStringAsync();
var parameters = ParseFormData(formData);
if (!parameters.ContainsKey("channel_id"))
{
parameters.Add("channel_id", app.GameConfig.ChannelId);
}
if (!parameters.ContainsKey("ip"))
{
parameters.Add("ip", httpContext.GetClientIpAddress());
}
if (!parameters.ContainsKey("time"))
{
parameters.Add("time", DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString());
}
string signKey = "";
signKey = signEncode(parameters, app.GameConfig.SignKey);
// 对参数进行加密(示例,使用简单的 Base64 编码)
var encryptedParameters = dic2PostData(parameters) + "&sign=" + signKey;
UpdateRequestUri(request, app.GameConfig.BsUrl);
// 更新请求体
request.Content = new StringContent(encryptedParameters, Encoding.UTF8, "application/x-www-form-urlencoded");
if (request.Content is FormUrlEncodedContent)
{
await UpdateRequestContentAsync(request, app, httpContext);
}
}
var sw = Stopwatch.StartNew();
var response = await base.SendAsync(request, cancellationToken);
sw.Stop();
if (response.IsSuccessStatusCode)
{
await AttachDebugInfoAsync(request, response, sw.Elapsed.TotalMilliseconds.ToString());
}
return response;
}
var settings = new JsonSerializerSettings
catch (Exception ex)
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
//var re = JsonConvert.SerializeObject(request, settings);
var response = await base.SendAsync(request, cancellationToken);
if (response.IsSuccessStatusCode)
{
var contentString = await response.Content.ReadAsStringAsync();
var jobj = JsonConvert.DeserializeObject<JObject>(contentString);
jobj["RequestStr"] = await request.ToJsonAsync();
jobj["ResponseStr"] = SerializeHttpResponseMessage(response, contentString);
var json = JsonConvert.SerializeObject(jobj);
var newContent = new StringContent(json, Encoding.UTF8, "application/json");
response.Content = newContent;
// 可根据实际需要扩展异常处理逻辑
throw new HttpRequestException("发送请求时发生错误。", ex);
}
return response;
}
/// <summary>
/// 更新请求的URI
/// </summary>
private void UpdateRequestUri(HttpRequestMessage request, string baseUrl)
{
var newUri = new Uri(new Uri(baseUrl), request.RequestUri.PathAndQuery);
request.RequestUri = newUri;
}
/// <summary>
/// 更新请求内容
/// </summary>
private async Task UpdateRequestContentAsync(HttpRequestMessage request, dynamic app, HttpContext httpContext)
{
var formData = await request.Content.ReadAsStringAsync();
var parameters = ParseFormData(formData);
AddDefaultParameters(parameters, app, httpContext);
var signKey = GenerateSignature(parameters, app.GameConfig.SignKey);
var encryptedParameters = $"{ConvertDictionaryToPostData(parameters)}&sign={signKey}";
request.Content = new StringContent(encryptedParameters, Encoding.UTF8, "application/x-www-form-urlencoded");
}
/// <summary>
/// 添加默认参数
/// </summary>
private void AddDefaultParameters(SortedDictionary<string, object> parameters, dynamic app, HttpContext httpContext)
{
if (!parameters.ContainsKey("channel_id"))
{
parameters["channel_id"] = app.GameConfig.ChannelId;
}
if (!parameters.ContainsKey("ip"))
{
parameters["ip"] = httpContext.GetClientIpAddress();
}
if (!parameters.ContainsKey("time"))
{
parameters["time"] = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString();
}
}
/// <summary>
/// 生成签名
/// </summary>
private string GenerateSignature(SortedDictionary<string, object> parameters, string signKey)
{
var dataString = string.Join("&", parameters.Select(kv => $"{kv.Key}={kv.Value}")) + $"&key={signKey}";
return MD5Encryption.ComputeMD5Hash(dataString).ToUpper();
}
/// <summary>
/// 附加调试信息到响应
/// </summary>
private async Task AttachDebugInfoAsync(HttpRequestMessage request, HttpResponseMessage response, string totalMilliseconds)
{
var responseContent = await response.Content.ReadAsStringAsync();
var responseJson = JsonConvert.DeserializeObject<JObject>(responseContent);
responseJson["RequestStr"] = await request.ToJsonAsync();
responseJson["ResponseStr"] = SerializeResponse(response, responseContent);
responseJson["TotalMilliseconds"] = totalMilliseconds;
var newContent = new StringContent(JsonConvert.SerializeObject(responseJson), Encoding.UTF8, "application/json");
response.Content = newContent;
}
/// <summary>
/// 序列化HTTP响应
/// </summary>
private string SerializeResponse(HttpResponseMessage response, string content)
{
return JsonConvert.SerializeObject(new
{
response.StatusCode,
response.ReasonPhrase,
Headers = response.Headers,
Content = content
});
}
/// <summary>
/// 解析表单数据
/// </summary>
private SortedDictionary<string, object> ParseFormData(string formData)
{
var parameters = new SortedDictionary<string, object>();
@ -90,65 +156,15 @@ public class JYApiHandler : DelegatingHandler
parameters[keyValue[0]] = keyValue[1];
}
}
return parameters;
}
/// <summary>
/// 字典参数 转 成url参数
/// </summary>
/// <param name="dic"></param>
/// <returns></returns>
private string dic2PostData(SortedDictionary<string, object> dic)
{
StringBuilder postData = new StringBuilder();
foreach (var item in dic)
{
//string s1 = HttpUtility.UrlEncode(item.Value.ToString());
string s1 = item.Value.ToString();
if (s1.Length > 0)
{
if (postData.Length == 0)
postData.AppendFormat("{0}={1}", item.Key, s1);
else
postData.AppendFormat("&{0}={1}", item.Key, s1);
}
}
return postData.ToString();
}
/// <summary>
/// 签名参数
/// 将字典转换为POST数据格式
/// </summary>
/// <param name="dicParams"></param>
/// <returns></returns>
public string signEncode(SortedDictionary<string, object> dicParams, string key)
private string ConvertDictionaryToPostData(SortedDictionary<string, object> dictionary)
{
StringBuilder str = new StringBuilder();
foreach (var item in dicParams)
{
string s1 = item.Value.ToString();
if (s1.Length > 0)
{
if (str.Length == 0)
str.AppendFormat("{0}={1}", item.Key, s1);
else
str.AppendFormat("&{0}={1}", item.Key, s1);
}
}
str.AppendFormat("&key={0}", key);
return MD5Encryption.ComputeMD5Hash(str.ToString()).ToUpper();
return string.Join("&", dictionary.Select(kv => $"{kv.Key}={kv.Value}"));
}
public string SerializeHttpResponseMessage(HttpResponseMessage response, string content)
{
var responseInfo = new
{
StatusCode = response.StatusCode,
ReasonPhrase = response.ReasonPhrase,
Headers = response.Headers,
Content = content,
};
return JsonConvert.SerializeObject(responseInfo, Formatting.None);
}
}
}

View File

@ -14,7 +14,18 @@ namespace CloudGaming.DtoModel.JY
/// <typeparam name="T"></typeparam>
public class JYApiResponse<T> : JYResponseCode<T> where T : class, new()
{
public string RequestStr { get; set; } // 请求信息
public string ResponseStr { get; set; } // 响应信息
/// <summary>
/// 请求信息
/// </summary>
public string RequestStr { get; set; }
/// <summary>
/// 响应信息
/// </summary>
public string ResponseStr { get; set; }
/// <summary>
/// 请求耗时
/// </summary>
public string TotalMilliseconds { get; set; }
}
}

View File

@ -19,5 +19,10 @@ namespace CloudGaming.DtoModel.PlayGame
/// 手机型号
/// </summary>
public string ModelName { get; set; }
/// <summary>
/// cpu
/// </summary>
public string Cpu { get; set; }
}
}