浏览代码

框架引用

懒得勤快 1 年之前
父节点
当前提交
2e689427eb

+ 1 - 0
Masuit.Tools.AspNetCore/AspNetCore/Executor/ResumeFileContentResultExecutor.cs

@@ -2,6 +2,7 @@
 using Masuit.Tools.AspNetCore.ResumeFileResults.ResumeFileResult;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Infrastructure;
+using Microsoft.Extensions.Logging;
 
 namespace Masuit.Tools.AspNetCore.ResumeFileResults.Executor;
 

+ 1 - 0
Masuit.Tools.AspNetCore/AspNetCore/Executor/ResumeFileStreamResultExecutor.cs

@@ -2,6 +2,7 @@
 using Masuit.Tools.AspNetCore.ResumeFileResults.ResumeFileResult;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Infrastructure;
+using Microsoft.Extensions.Logging;
 
 namespace Masuit.Tools.AspNetCore.ResumeFileResults.Executor;
 

+ 1 - 0
Masuit.Tools.AspNetCore/AspNetCore/Executor/ResumePhysicalFileResultExecutor.cs

@@ -2,6 +2,7 @@
 using Masuit.Tools.AspNetCore.ResumeFileResults.ResumeFileResult;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Infrastructure;
+using Microsoft.Extensions.Logging;
 
 namespace Masuit.Tools.AspNetCore.ResumeFileResults.Executor;
 

+ 2 - 0
Masuit.Tools.AspNetCore/AspNetCore/Executor/ResumeVirtualFileResultExecutor.cs

@@ -1,7 +1,9 @@
 using Masuit.Tools.AspNetCore.ResumeFileResults.Extensions;
 using Masuit.Tools.AspNetCore.ResumeFileResults.ResumeFileResult;
+using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Infrastructure;
+using Microsoft.Extensions.Logging;
 
 namespace Masuit.Tools.AspNetCore.ResumeFileResults.Executor;
 

+ 1 - 0
Masuit.Tools.AspNetCore/AspNetCore/ResumeFileResult/ResumeFileContentResult.cs

@@ -1,5 +1,6 @@
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Infrastructure;
+using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Net.Http.Headers;
 
 namespace Masuit.Tools.AspNetCore.ResumeFileResults.ResumeFileResult;

+ 1 - 0
Masuit.Tools.AspNetCore/AspNetCore/ResumeFileResult/ResumeFileStreamResult.cs

@@ -1,5 +1,6 @@
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Infrastructure;
+using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Net.Http.Headers;
 
 namespace Masuit.Tools.AspNetCore.ResumeFileResults.ResumeFileResult;

+ 1 - 0
Masuit.Tools.AspNetCore/AspNetCore/ResumeFileResult/ResumePhysicalFileResult.cs

@@ -1,5 +1,6 @@
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Infrastructure;
+using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Net.Http.Headers;
 
 namespace Masuit.Tools.AspNetCore.ResumeFileResults.ResumeFileResult;

+ 1 - 0
Masuit.Tools.AspNetCore/AspNetCore/ResumeFileResult/ResumeVirtualFileResult.cs

@@ -1,5 +1,6 @@
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Infrastructure;
+using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Net.Http.Headers;
 
 namespace Masuit.Tools.AspNetCore.ResumeFileResults.ResumeFileResult;

+ 3 - 1
Masuit.Tools.AspNetCore/AspNetCore/ServiceCollectionExtensions.cs

@@ -4,6 +4,8 @@ using Masuit.Tools.Files;
 using Microsoft.AspNetCore.Mvc.Infrastructure;
 using Microsoft.Extensions.DependencyInjection.Extensions;
 using System.Reflection;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
 
 namespace Masuit.Tools.Core.AspNetCore;
 
@@ -65,7 +67,7 @@ public static class ServiceCollectionExtensions
     /// <param name="services"></param>
     private static void RegisterServiceByAttribute(this IServiceCollection services, IEnumerable<Assembly> assemblies)
     {
-        var types = assemblies.SelectMany(t => t.GetTypes()).Where(t => t.GetCustomAttributes(typeof(ServiceInjectAttribute), false).Length > 0 && t.IsClass && !t.IsAbstract).ToList();
+        var types = assemblies.SelectMany(t => t.GetTypes()).Where(t => t.GetCustomAttributes(typeof(ServiceInjectAttribute), false).Length > 0 && t.IsClass && !t.IsAbstract);
 
         foreach (var type in types)
         {

+ 1 - 0
Masuit.Tools.AspNetCore/Extensions/MultipartRequestService.cs

@@ -4,6 +4,7 @@ using Microsoft.AspNetCore.WebUtilities;
 using Microsoft.Extensions.Primitives;
 using Microsoft.Net.Http.Headers;
 using System.Text;
+using Microsoft.Extensions.DependencyInjection;
 
 namespace Masuit.Tools.AspNetCore.Extensions;
 

+ 2 - 1
Masuit.Tools.AspNetCore/Extensions/ServiceCollectionExt.cs

@@ -1,4 +1,5 @@
-using Microsoft.Extensions.DependencyInjection.Extensions;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyInjection.Extensions;
 
 namespace Masuit.Tools.AspNetCore.Extensions;
 

+ 3 - 2
Masuit.Tools.AspNetCore/Masuit.Tools.AspNetCore.csproj

@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk">
 
     <PropertyGroup>
         <TargetFrameworks>netcoreapp3.1;net5;net6;net7;net8</TargetFrameworks>
@@ -44,7 +44,8 @@
     </ItemGroup>
 
     <ItemGroup>
-      <PackageReference Include="FastExpressionCompiler" Version="4.0.1" />
+        <FrameworkReference Include="Microsoft.AspNetCore.App" />
+        <PackageReference Include="FastExpressionCompiler" Version="4.0.1" />
       <PackageReference Include="System.Net.Http.Json" Version="8.0" />
     </ItemGroup>
 

+ 79 - 77
Masuit.Tools.AspNetCore/ModelBinder/BodyOrDefaultBinderMiddleware.cs

@@ -1,95 +1,97 @@
 using System.Net.Mime;
 using System.Text;
 using System.Xml.Linq;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Logging;
 using Newtonsoft.Json.Linq;
 
 namespace Masuit.Tools.AspNetCore.ModelBinder;
 
 public sealed class BodyOrDefaultBinderMiddleware
 {
-	private readonly RequestDelegate _next;
-	private readonly ILogger<BodyOrDefaultBinderMiddleware> _logger;
+    private readonly RequestDelegate _next;
+    private readonly ILogger<BodyOrDefaultBinderMiddleware> _logger;
 
-	public BodyOrDefaultBinderMiddleware(RequestDelegate next, ILogger<BodyOrDefaultBinderMiddleware> logger)
-	{
-		_next = next;
-		_logger = logger;
-	}
+    public BodyOrDefaultBinderMiddleware(RequestDelegate next, ILogger<BodyOrDefaultBinderMiddleware> logger)
+    {
+        _next = next;
+        _logger = logger;
+    }
 
-	public Task Invoke(HttpContext context)
-	{
-		var contentType = context.Request.ContentType;
-		string mediaType;
-		var charSet = "utf-8";
-		if (string.IsNullOrWhiteSpace(contentType))
-		{
-			//表单提交
-			mediaType = "application/x-www-form-urlencoded";
-		}
-		else
-		{
-			var type = new ContentType(contentType);
-			if (!string.IsNullOrWhiteSpace(type.CharSet))
-			{
-				charSet = type.CharSet;
-			}
+    public Task Invoke(HttpContext context)
+    {
+        var contentType = context.Request.ContentType;
+        string mediaType;
+        var charSet = "utf-8";
+        if (string.IsNullOrWhiteSpace(contentType))
+        {
+            //表单提交
+            mediaType = "application/x-www-form-urlencoded";
+        }
+        else
+        {
+            var type = new ContentType(contentType);
+            if (!string.IsNullOrWhiteSpace(type.CharSet))
+            {
+                charSet = type.CharSet;
+            }
 
-			mediaType = type.MediaType.ToLower();
-		}
+            mediaType = type.MediaType.ToLower();
+        }
 
-		var encoding = Encoding.GetEncoding(charSet);
-		if (mediaType == "application/x-www-form-urlencoded")
-		{
-			//普通表单提交
-		}
-		else if (mediaType == "multipart/form-data")
-		{
-			//带有文件的表单提交
-		}
-		else if (mediaType == "application/json")
-		{
-			var body = context.GetBodyString(encoding)?.Trim();
-			if (string.IsNullOrWhiteSpace(body))
-			{
-				return _next(context);
-			}
+        var encoding = Encoding.GetEncoding(charSet);
+        if (mediaType == "application/x-www-form-urlencoded")
+        {
+            //普通表单提交
+        }
+        else if (mediaType == "multipart/form-data")
+        {
+            //带有文件的表单提交
+        }
+        else if (mediaType == "application/json")
+        {
+            var body = context.GetBodyString(encoding)?.Trim();
+            if (string.IsNullOrWhiteSpace(body))
+            {
+                return _next(context);
+            }
 
-			if (!(body.StartsWith("{") && body.EndsWith("}")))
-			{
-				return _next(context);
-			}
+            if (!(body.StartsWith("{") && body.EndsWith("}")))
+            {
+                return _next(context);
+            }
 
-			try
-			{
-				context.Items.AddOrUpdate("BodyOrDefaultModelBinder@JsonBody", _ => JObject.Parse(body), (_, _) => JObject.Parse(body));
-				return _next(context);
-			}
-			catch (Exception ex)
-			{
-				_logger.LogError(ex, "Parsing json failed:" + body);
-				return _next(context);
-			}
-		}
-		else if (mediaType == "application/xml")
-		{
-			var body = context.GetBodyString(encoding)?.Trim();
-			if (string.IsNullOrWhiteSpace(body))
-			{
-				return _next(context);
-			}
+            try
+            {
+                context.Items.AddOrUpdate("BodyOrDefaultModelBinder@JsonBody", _ => JObject.Parse(body), (_, _) => JObject.Parse(body));
+                return _next(context);
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError(ex, "Parsing json failed:" + body);
+                return _next(context);
+            }
+        }
+        else if (mediaType == "application/xml")
+        {
+            var body = context.GetBodyString(encoding)?.Trim();
+            if (string.IsNullOrWhiteSpace(body))
+            {
+                return _next(context);
+            }
 
-			try
-			{
-				context.Items.AddOrUpdate("BodyOrDefaultModelBinder@XmlBody", _ => XDocument.Parse(body), (_, _) => XDocument.Parse(body));
-				return _next(context);
-			}
-			catch (Exception ex)
-			{
-				_logger.LogError(ex, "Parsing xml failed:" + body);
-				return _next(context);
-			}
-		}
+            try
+            {
+                context.Items.AddOrUpdate("BodyOrDefaultModelBinder@XmlBody", _ => XDocument.Parse(body), (_, _) => XDocument.Parse(body));
+                return _next(context);
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError(ex, "Parsing xml failed:" + body);
+                return _next(context);
+            }
+        }
 
-		return _next(context);
-	}
+        return _next(context);
+    }
 }

+ 292 - 290
Masuit.Tools.AspNetCore/ModelBinder/FromBodyOrDefaultModelBinder.cs

@@ -4,6 +4,8 @@ using System.Reflection;
 using System.Xml.Linq;
 using Masuit.Tools.Systems;
 using Microsoft.AspNetCore.Mvc.ModelBinding;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Primitives;
 using Newtonsoft.Json.Linq;
 
@@ -11,294 +13,294 @@ namespace Masuit.Tools.AspNetCore.ModelBinder;
 
 public class FromBodyOrDefaultModelBinder : IModelBinder
 {
-	private static readonly List<BindType> BindTypes = new()
-	{
-		BindType.Query,
-		BindType.Body,
-		BindType.Header,
-		BindType.Form,
-		BindType.Cookie,
-		BindType.Route
-	};
-
-	private readonly ILogger<FromBodyOrDefaultModelBinder> _logger;
-
-	public FromBodyOrDefaultModelBinder(ILogger<FromBodyOrDefaultModelBinder> logger)
-	{
-		_logger = logger;
-	}
-
-	public Task BindModelAsync(ModelBindingContext bindingContext)
-	{
-		var context = bindingContext.HttpContext;
-		var attr = bindingContext.GetAttribute<FromBodyOrDefaultAttribute>();
-		var field = attr?.FieldName ?? bindingContext.FieldName;
-		var modelType = bindingContext.ModelType;
-		object value = null;
-		if (attr != null)
-		{
-			if (modelType.IsSimpleType() || modelType.IsSimpleArrayType() || modelType.IsSimpleListType())
-			{
-				if (attr.Type == BindType.Default)
-				{
-					foreach (var type in BindTypes)
-					{
-						value = GetBindingValue(bindingContext, type, field, modelType);
-						if (value != null)
-						{
-							break;
-						}
-					}
-				}
-				else
-				{
-					foreach (var type in attr.Type.Split())
-					{
-						value = GetBindingValue(bindingContext, type, field, modelType);
-						if (value != null)
-						{
-							break;
-						}
-					}
-				}
-			}
-			else
-			{
-				if (bindingContext.HttpContext.Items.TryGetValue("BodyOrDefaultModelBinder@JsonBody", out var obj) && obj is JObject json)
-				{
-					if (modelType.IsArray || modelType.IsGenericType && modelType.GenericTypeArguments.Length == 1)
-					{
-						if (json.TryGetValue(field, StringComparison.OrdinalIgnoreCase, out var jtoken))
-						{
-							value = jtoken.ToObject(modelType);
-						}
-						else
-						{
-							_logger.LogWarning($"TraceIdentifier:{context.TraceIdentifier},BodyOrDefaultModelBinder从{json}中获取{field}失败!");
-						}
-					}
-					else
-					{
-						// 可能是 字典或者实体 类型,尝试将modeltype 当初整个请求参数对象
-						try
-						{
-							value = json.ToObject(modelType);
-						}
-						catch (Exception e)
-						{
-							_logger.LogError(e, e.Message, json.ToString());
-						}
-					}
-				}
-
-				if (value == null)
-				{
-					var (requestData, keys) = GetRequestData(bindingContext, modelType);
-					if (keys.Any())
-					{
-						var instance = Activator.CreateInstance(modelType);
-						switch (requestData)
-						{
-							case IEnumerable<KeyValuePair<string, StringValues>> stringValues:
-								{
-									foreach (var item in stringValues)
-									{
-										var property = modelType.GetProperty(item.Key, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
-										if (property != null)
-										{
-											property.SetValue(instance, item.Value.ConvertObject(property.PropertyType));
-										}
-									}
-
-									break;
-								}
-							case IEnumerable<KeyValuePair<string, string>> strs:
-								{
-									//处理Cookie
-									foreach (var item in strs)
-									{
-										var property = modelType.GetProperty(item.Key, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
-										if (property != null)
-										{
-											property.SetValue(instance, item.Value.ConvertObject(property.PropertyType));
-										}
-									}
-
-									break;
-								}
-							case IEnumerable<KeyValuePair<string, object>> objects:
-								{
-									//处理路由
-									foreach (var item in objects)
-									{
-										var property = modelType.GetProperty(item.Key, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
-										if (property != null)
-										{
-											property.SetValue(instance, item.Value.ConvertObject(property.PropertyType));
-										}
-									}
-
-									break;
-								}
-						}
-
-						value = instance;
-					}
-				}
-			}
-
-			if (value == null && attr.DefaultValue != null)
-			{
-				value = attr.DefaultValue.ChangeType(modelType);
-			}
-		}
-
-		if (value != null)
-		{
-			bindingContext.Result = ModelBindingResult.Success(value);
-		}
-
-		return Task.CompletedTask;
-	}
-
-	private static (IEnumerable data, List<string> keys) GetRequestData(ModelBindingContext bindingContext, Type type)
-	{
-		var request = bindingContext.HttpContext.Request;
-		var props = type.GetProperties().Select(t => t.Name).ToList();
-		var query = props.Except(request.Query.Keys, StringComparer.OrdinalIgnoreCase).ToList();
-		var headers = props.Except(request.Headers.Keys, StringComparer.OrdinalIgnoreCase).ToList();
-		var cookies = props.Except(request.Cookies.Keys, StringComparer.OrdinalIgnoreCase).ToList();
-		var routes = props.Except(bindingContext.ActionContext.RouteData.Values.Keys, StringComparer.OrdinalIgnoreCase).ToList();
-		var list = new List<KeyValuePair<List<string>, IEnumerable>>()
-		{
-			new(query, request.Query),
-			new(headers, request.Headers),
-			new(cookies, request.Cookies),
-			new(routes, bindingContext.ActionContext.RouteData.Values),
-		};
-
-		if (request.HasFormContentType && request.Form.Count > 0)
-		{
-			var forms = props.Except(request.Form.Keys, StringComparer.OrdinalIgnoreCase).ToList();
-			list.Add(new KeyValuePair<List<string>, IEnumerable>(forms, request.Form));
-		}
-
-		var kv = list.OrderBy(t => t.Key.Count).FirstOrDefault();
-		return (kv.Value, props.Except(kv.Key).ToList());
-	}
-
-	/// <summary>
-	/// 获取要绑定的值
-	/// </summary>
-	/// <param name="bindingContext"></param>
-	/// <param name="bindType"></param>
-	/// <param name="fieldName"></param>
-	/// <param name="modelType"></param>
-	private object GetBindingValue(ModelBindingContext bindingContext, BindType bindType, string fieldName, Type modelType)
-	{
-		var context = bindingContext.HttpContext;
-		var mediaType = string.Empty;
-		if (!string.IsNullOrWhiteSpace(context.Request.ContentType))
-		{
-			try
-			{
-				var contentType = new ContentType(context.Request.ContentType);
-				mediaType = contentType.MediaType.ToLower();
-			}
-			catch (Exception ex)
-			{
-				_logger.LogError(ex, ex.Message, context.Request.ContentType);
-			}
-		}
-
-		object targetValue = null;
-		switch (bindType)
-		{
-			case BindType.Body:
-				switch (mediaType)
-				{
-					case "application/json":
-						{
-							if (bindingContext.HttpContext.Items.TryGetValue("BodyOrDefaultModelBinder@JsonBody", out var obj) && obj is JObject json && json.TryGetValue(fieldName, StringComparison.OrdinalIgnoreCase, out var values))
-							{
-								targetValue = values.ConvertObject(modelType);
-							}
-						}
-
-						break;
-
-					case "application/xml":
-						{
-							if (bindingContext.HttpContext.Items.TryGetValue("BodyOrDefaultModelBinder@XmlBody", out var obj) && obj is XDocument xml)
-							{
-								var xmlElt = xml.Element(fieldName);
-								if (xmlElt != null)
-								{
-									targetValue = xmlElt.Value.ConvertObject(modelType);
-								}
-							}
-
-							break;
-						}
-				}
-
-				break;
-
-			case BindType.Query:
-				{
-					if (context.Request.Query is { Count: > 0 } && context.Request.Query.TryGetValue(fieldName, out var values))
-					{
-						targetValue = values.ConvertObject(modelType);
-					}
-				}
-
-				break;
-
-			case BindType.Form:
-				{
-					if (context.Request is { HasFormContentType: true, Form.Count: > 0 } && context.Request.Form.TryGetValue(fieldName, out var values))
-					{
-						targetValue = values.ConvertObject(modelType);
-					}
-				}
-
-				break;
-
-			case BindType.Header:
-				{
-					if (context.Request.Headers is { Count: > 0 } && context.Request.Headers.TryGetValue(fieldName, out var values))
-					{
-						targetValue = values.ConvertObject(modelType);
-					}
-				}
-
-				break;
-
-			case BindType.Cookie:
-				{
-					if (context.Request.Cookies is { Count: > 0 } && context.Request.Cookies.TryGetValue(fieldName, out var values))
-					{
-						targetValue = values.ConvertObject(modelType);
-					}
-				}
-
-				break;
-
-			case BindType.Route:
-				{
-					if (bindingContext.ActionContext.RouteData.Values is { Count: > 0 } && bindingContext.ActionContext.RouteData.Values.TryGetValue(fieldName, out var values))
-					{
-						targetValue = values.ConvertObject(modelType);
-					}
-				}
-
-				break;
-
-			case BindType.Services:
-				targetValue = bindingContext.ActionContext.HttpContext.RequestServices.GetRequiredService(modelType);
-				break;
-		}
-
-		return targetValue;
-	}
+    private static readonly List<BindType> BindTypes = new()
+    {
+        BindType.Query,
+        BindType.Body,
+        BindType.Header,
+        BindType.Form,
+        BindType.Cookie,
+        BindType.Route
+    };
+
+    private readonly ILogger<FromBodyOrDefaultModelBinder> _logger;
+
+    public FromBodyOrDefaultModelBinder(ILogger<FromBodyOrDefaultModelBinder> logger)
+    {
+        _logger = logger;
+    }
+
+    public Task BindModelAsync(ModelBindingContext bindingContext)
+    {
+        var context = bindingContext.HttpContext;
+        var attr = bindingContext.GetAttribute<FromBodyOrDefaultAttribute>();
+        var field = attr?.FieldName ?? bindingContext.FieldName;
+        var modelType = bindingContext.ModelType;
+        object value = null;
+        if (attr != null)
+        {
+            if (modelType.IsSimpleType() || modelType.IsSimpleArrayType() || modelType.IsSimpleListType())
+            {
+                if (attr.Type == BindType.Default)
+                {
+                    foreach (var type in BindTypes)
+                    {
+                        value = GetBindingValue(bindingContext, type, field, modelType);
+                        if (value != null)
+                        {
+                            break;
+                        }
+                    }
+                }
+                else
+                {
+                    foreach (var type in attr.Type.Split())
+                    {
+                        value = GetBindingValue(bindingContext, type, field, modelType);
+                        if (value != null)
+                        {
+                            break;
+                        }
+                    }
+                }
+            }
+            else
+            {
+                if (bindingContext.HttpContext.Items.TryGetValue("BodyOrDefaultModelBinder@JsonBody", out var obj) && obj is JObject json)
+                {
+                    if (modelType.IsArray || modelType.IsGenericType && modelType.GenericTypeArguments.Length == 1)
+                    {
+                        if (json.TryGetValue(field, StringComparison.OrdinalIgnoreCase, out var jtoken))
+                        {
+                            value = jtoken.ToObject(modelType);
+                        }
+                        else
+                        {
+                            _logger.LogWarning($"TraceIdentifier:{context.TraceIdentifier},BodyOrDefaultModelBinder从{json}中获取{field}失败!");
+                        }
+                    }
+                    else
+                    {
+                        // 可能是 字典或者实体 类型,尝试将modeltype 当初整个请求参数对象
+                        try
+                        {
+                            value = json.ToObject(modelType);
+                        }
+                        catch (Exception e)
+                        {
+                            _logger.LogError(e, e.Message, json.ToString());
+                        }
+                    }
+                }
+
+                if (value == null)
+                {
+                    var (requestData, keys) = GetRequestData(bindingContext, modelType);
+                    if (keys.Any())
+                    {
+                        var instance = Activator.CreateInstance(modelType);
+                        switch (requestData)
+                        {
+                            case IEnumerable<KeyValuePair<string, StringValues>> stringValues:
+                                {
+                                    foreach (var item in stringValues)
+                                    {
+                                        var property = modelType.GetProperty(item.Key, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
+                                        if (property != null)
+                                        {
+                                            property.SetValue(instance, item.Value.ConvertObject(property.PropertyType));
+                                        }
+                                    }
+
+                                    break;
+                                }
+                            case IEnumerable<KeyValuePair<string, string>> strs:
+                                {
+                                    //处理Cookie
+                                    foreach (var item in strs)
+                                    {
+                                        var property = modelType.GetProperty(item.Key, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
+                                        if (property != null)
+                                        {
+                                            property.SetValue(instance, item.Value.ConvertObject(property.PropertyType));
+                                        }
+                                    }
+
+                                    break;
+                                }
+                            case IEnumerable<KeyValuePair<string, object>> objects:
+                                {
+                                    //处理路由
+                                    foreach (var item in objects)
+                                    {
+                                        var property = modelType.GetProperty(item.Key, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
+                                        if (property != null)
+                                        {
+                                            property.SetValue(instance, item.Value.ConvertObject(property.PropertyType));
+                                        }
+                                    }
+
+                                    break;
+                                }
+                        }
+
+                        value = instance;
+                    }
+                }
+            }
+
+            if (value == null && attr.DefaultValue != null)
+            {
+                value = attr.DefaultValue.ChangeType(modelType);
+            }
+        }
+
+        if (value != null)
+        {
+            bindingContext.Result = ModelBindingResult.Success(value);
+        }
+
+        return Task.CompletedTask;
+    }
+
+    private static (IEnumerable data, List<string> keys) GetRequestData(ModelBindingContext bindingContext, Type type)
+    {
+        var request = bindingContext.HttpContext.Request;
+        var props = type.GetProperties().Select(t => t.Name).ToList();
+        var query = props.Except(request.Query.Keys, StringComparer.OrdinalIgnoreCase).ToList();
+        var headers = props.Except(request.Headers.Keys, StringComparer.OrdinalIgnoreCase).ToList();
+        var cookies = props.Except(request.Cookies.Keys, StringComparer.OrdinalIgnoreCase).ToList();
+        var routes = props.Except(bindingContext.ActionContext.RouteData.Values.Keys, StringComparer.OrdinalIgnoreCase).ToList();
+        var list = new List<KeyValuePair<List<string>, IEnumerable>>()
+        {
+            new(query, request.Query),
+            new(headers, request.Headers),
+            new(cookies, request.Cookies),
+            new(routes, bindingContext.ActionContext.RouteData.Values),
+        };
+
+        if (request.HasFormContentType && request.Form.Count > 0)
+        {
+            var forms = props.Except(request.Form.Keys, StringComparer.OrdinalIgnoreCase).ToList();
+            list.Add(new KeyValuePair<List<string>, IEnumerable>(forms, request.Form));
+        }
+
+        var kv = list.OrderBy(t => t.Key.Count).FirstOrDefault();
+        return (kv.Value, props.Except(kv.Key).ToList());
+    }
+
+    /// <summary>
+    /// 获取要绑定的值
+    /// </summary>
+    /// <param name="bindingContext"></param>
+    /// <param name="bindType"></param>
+    /// <param name="fieldName"></param>
+    /// <param name="modelType"></param>
+    private object GetBindingValue(ModelBindingContext bindingContext, BindType bindType, string fieldName, Type modelType)
+    {
+        var context = bindingContext.HttpContext;
+        var mediaType = string.Empty;
+        if (!string.IsNullOrWhiteSpace(context.Request.ContentType))
+        {
+            try
+            {
+                var contentType = new ContentType(context.Request.ContentType);
+                mediaType = contentType.MediaType.ToLower();
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError(ex, ex.Message, context.Request.ContentType);
+            }
+        }
+
+        object targetValue = null;
+        switch (bindType)
+        {
+            case BindType.Body:
+                switch (mediaType)
+                {
+                    case "application/json":
+                        {
+                            if (bindingContext.HttpContext.Items.TryGetValue("BodyOrDefaultModelBinder@JsonBody", out var obj) && obj is JObject json && json.TryGetValue(fieldName, StringComparison.OrdinalIgnoreCase, out var values))
+                            {
+                                targetValue = values.ConvertObject(modelType);
+                            }
+                        }
+
+                        break;
+
+                    case "application/xml":
+                        {
+                            if (bindingContext.HttpContext.Items.TryGetValue("BodyOrDefaultModelBinder@XmlBody", out var obj) && obj is XDocument xml)
+                            {
+                                var xmlElt = xml.Element(fieldName);
+                                if (xmlElt != null)
+                                {
+                                    targetValue = xmlElt.Value.ConvertObject(modelType);
+                                }
+                            }
+
+                            break;
+                        }
+                }
+
+                break;
+
+            case BindType.Query:
+                {
+                    if (context.Request.Query is { Count: > 0 } && context.Request.Query.TryGetValue(fieldName, out var values))
+                    {
+                        targetValue = values.ConvertObject(modelType);
+                    }
+                }
+
+                break;
+
+            case BindType.Form:
+                {
+                    if (context.Request is { HasFormContentType: true, Form.Count: > 0 } && context.Request.Form.TryGetValue(fieldName, out var values))
+                    {
+                        targetValue = values.ConvertObject(modelType);
+                    }
+                }
+
+                break;
+
+            case BindType.Header:
+                {
+                    if (context.Request.Headers is { Count: > 0 } && context.Request.Headers.TryGetValue(fieldName, out var values))
+                    {
+                        targetValue = values.ConvertObject(modelType);
+                    }
+                }
+
+                break;
+
+            case BindType.Cookie:
+                {
+                    if (context.Request.Cookies is { Count: > 0 } && context.Request.Cookies.TryGetValue(fieldName, out var values))
+                    {
+                        targetValue = values.ConvertObject(modelType);
+                    }
+                }
+
+                break;
+
+            case BindType.Route:
+                {
+                    if (bindingContext.ActionContext.RouteData.Values is { Count: > 0 } && bindingContext.ActionContext.RouteData.Values.TryGetValue(fieldName, out var values))
+                    {
+                        targetValue = values.ConvertObject(modelType);
+                    }
+                }
+
+                break;
+
+            case BindType.Services:
+                targetValue = bindingContext.ActionContext.HttpContext.RequestServices.GetRequiredService(modelType);
+                break;
+        }
+
+        return targetValue;
+    }
 }

+ 12 - 10
Masuit.Tools.AspNetCore/ModelBinder/MiddlewareExtensions.cs

@@ -1,14 +1,16 @@
-namespace Masuit.Tools.AspNetCore.ModelBinder;
+using Microsoft.AspNetCore.Builder;
+
+namespace Masuit.Tools.AspNetCore.ModelBinder;
 
 public static class MiddlewareExtensions
 {
-	/// <summary>
-	/// 使用自动参数绑定中间件
-	/// </summary>
-	/// <param name="appBuilder"></param>
-	/// <returns></returns>
-	public static IApplicationBuilder UseBodyOrDefaultModelBinder(this IApplicationBuilder appBuilder)
-	{
-		return appBuilder.UseMiddleware<BodyOrDefaultBinderMiddleware>();
-	}
+    /// <summary>
+    /// 使用自动参数绑定中间件
+    /// </summary>
+    /// <param name="appBuilder"></param>
+    /// <returns></returns>
+    public static IApplicationBuilder UseBodyOrDefaultModelBinder(this IApplicationBuilder appBuilder)
+    {
+        return appBuilder.UseMiddleware<BodyOrDefaultBinderMiddleware>();
+    }
 }

+ 1 - 0
Masuit.Tools.AspNetCore/ModelBinder/ModelBindingContextExtension.cs

@@ -1,5 +1,6 @@
 using System.Net.Mime;
 using System.Text;
+using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc.Controllers;
 using Microsoft.AspNetCore.Mvc.ModelBinding;
 using Microsoft.Extensions.Primitives;

+ 1 - 0
Masuit.Tools.AspNetCore/Net/WebExtension.cs

@@ -1,6 +1,7 @@
 using FastExpressionCompiler;
 using Newtonsoft.Json;
 using System.Linq.Expressions;
+using Microsoft.AspNetCore.Http;
 
 namespace Masuit.Tools.Core.Net;