提交代码
This commit is contained in:
parent
c48d7fd34d
commit
93c27b5c55
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,5 +19,10 @@ namespace CloudGaming.DtoModel.PlayGame
|
|||
/// 手机型号
|
||||
/// </summary>
|
||||
public string ModelName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// cpu
|
||||
/// </summary>
|
||||
public string Cpu { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user