123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- using Microsoft.AspNetCore.Http.Features;
- using Sers.Core.Module.Rpc;
- using System;
- using System.IO;
- using Microsoft.AspNetCore.Http;
- using Sers.Serslot;
- using System.Runtime.CompilerServices;
- namespace Vit.Extensions
- {
- public static partial class SerslotServer_ProcessRequest_Extensions
- {
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static byte[] ProcessRequestByRpc(this SerslotServer data, ArraySegment<byte> arg_OriData)
- {
- HttpRequestFeature requestFeature = null;
- IHttpResponseFeature responseFeature = null;
- try
- {
- var rpcData = RpcContext.RpcData;
- #region (x.1) build requestFeature
- // "http://127.0.0.1/Station1/fold1/a/1/2.html?c=9"
- var http_url = rpcData.http.url;
- Uri uri = new Uri(http_url);
- //var Query = Uri.UnescapeDataString(uri.Query);
- var Query = uri.Query;
- var AbsolutePath = Uri.UnescapeDataString(uri.AbsolutePath);
- //var AbsolutePath = uri.AbsolutePath;
- requestFeature = new HttpRequestFeature
- {
- Body = new MemoryStream(arg_OriData.Array, arg_OriData.Offset, arg_OriData.Count),
- Headers = new HeaderDictionary(),
- Protocol = rpcData.http.protocol,
- Scheme = uri.Scheme,
- Method = rpcData.http.method,
- PathBase = "",
- QueryString = uri.Query,
- Path = AbsolutePath,
- RawTarget = AbsolutePath,
- };
- #region http header
- foreach (var t in rpcData.http.headers)
- {
- requestFeature.Headers[t.Key] = t.Value;
- }
- #endregion
- //var requestFeature = new HttpRequestFeature
- //{
- // Body = new MemoryStream(),
- // Protocol = "HTTP/2.0",
- // Scheme = "http",
- // Method = "GET",
- // PathBase = "",
- // Path = "/api/values",
- // QueryString = "",
- // RawTarget = "/api/values"
- //};
- #endregion
- #region (x.2) ProcessRequest
- responseFeature = data.ProcessRequest(requestFeature);
- #endregion
- #region (x.3)build reply info
- var rpcReply = new RpcContextData();
- //(x.x.1)StatusCode
- rpcReply.http.statusCode=responseFeature.StatusCode;
- #region (x.x.2)http_header
- var replyHeader = responseFeature.Headers;
- if (replyHeader != null)
- {
- foreach (var item in replyHeader)
- {
- rpcReply.http.headers[item.Key]=item.Value.ToString();
- }
- }
- #endregion
- //(x.x.3)
- RpcContext.Current.apiReplyMessage.rpcContextData_OriData = rpcReply.ToBytes().BytesToArraySegmentByte();
- #endregion
- #region (x.4) return reply data
- return (responseFeature.Body as MemoryStream).ToArray();
- #endregion
- }
- finally
- {
- requestFeature?.Body?.Dispose();
- responseFeature?.Body?.Dispose();
- }
- }
- }
- }
|