南骏 池
8 天以前 f4e84a98facb28bbfc63343c81095a9787812e27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using Microsoft.AspNetCore.Http;
using System.Dynamic;
 
public class RequestInfo : DynamicObject
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private readonly ExpandoObject _data = new ExpandoObject();
 
    public RequestInfo(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
        InitializeData();
    }
 
    private void InitializeData()
    {
        // 初始化所有需要的请求头参数
        SetValue("OrgId", GetHeaderValue("OrgId"));
        //// 可以继续添加其他参数
        //SetValue("UserId", GetHeaderValue("UserId"));
        //SetValue("Language", GetHeaderValue("Language"));
    }
 
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        string name = binder.Name;
        return ((IDictionary<string, object>)_data).TryGetValue(name, out result);
    }
 
    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        ((IDictionary<string, object>)_data)[binder.Name] = value;
        return true;
    }
 
    public string GetHeaderValue(string key)
    {
        var httpContext = _httpContextAccessor.HttpContext;
        if (httpContext?.Request.Headers.TryGetValue(key, out var value) == true)
        {
            return value.ToString();
        }
        return null;
    }
 
    private void SetValue(string key, object value)
    {
        ((IDictionary<string, object>)_data)[key] = value;
    }
 
    // 添加一个方法来检查必需参数是否存在
    public void ValidateRequired(params string[] requiredFields)
    {
        foreach (var field in requiredFields)
        {
            if (!((IDictionary<string, object>)_data).ContainsKey(field) ||
                ((IDictionary<string, object>)_data)[field] == null)
            {
                throw new ArgumentException($"请求头中缺少必需的 {field} 参数");
            }
        }
    }
}