参考了:https://www.cnblogs.com/zhaozhengyan/p/aspnet-core-webapi-array-handle.html
①.NET Core WebApi项目里添加一个 ArraryHandleQueryConvention.cs 类文件,其内容如下:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.Primitives;
using System;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
namespace JYJTSYSTEM.API
{
public class ArraryHandleQueryConvention : IParameterModelConvention
{
public void Apply(ParameterModel parameter)
{
if (parameter.ParameterType.IsArray || parameter.Attributes.OfType<FromQueryAttribute>().Any())
parameter.Action.Filters.Add(new ArrayQueryStringAttribute(parameter.ParameterName));
}
}
public class ArrayQueryStringValueProvider : QueryStringValueProvider
{
private readonly string _key;
private readonly IQueryCollection _values;
public ArrayQueryStringValueProvider(IQueryCollection values)
: this(null, values)
{
}
public ArrayQueryStringValueProvider(string key, IQueryCollection values)
: base(BindingSource.Query, values, CultureInfo.InvariantCulture)
{
_key = key;
_values = values;
}
public override ValueProviderResult GetValue(string key)
{
var result = base.GetValue(key + "[]");
if (_key != null && _key != key)
{
return result;
}
if (result != ValueProviderResult.None)
{
var splitValues = new StringValues(result.Values.ToArray());
return new ValueProviderResult(splitValues, result.Culture);
}
return result;
}
}
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public class ArrayQueryStringAttribute : Attribute, IResourceFilter
{
private readonly ArrayQueryStringValueProviderFactory _factory;
public ArrayQueryStringAttribute(string key)
{
_factory = new ArrayQueryStringValueProviderFactory();
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
}
public void OnResourceExecuting(ResourceExecutingContext context)
{
context.ValueProviderFactories.Insert(0, _factory);
}
}
public class ArrayQueryStringValueProviderFactory : IValueProviderFactory
{
private readonly string _key;
public ArrayQueryStringValueProviderFactory()
{
}
public ArrayQueryStringValueProviderFactory(string key)
{
_key = key;
}
public Task CreateValueProviderAsync(ValueProviderFactoryContext context)
{
context.ValueProviders.Insert(0, new ArrayQueryStringValueProvider(_key, context.ActionContext.HttpContext.Request.Query));
return Task.CompletedTask;
}
}
}
②修改 Startup.cs 里的 public void ConfigureServices(IServiceCollection services) 函数,如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(o =>
{
o.Conventions.Add(new ArraryHandleQueryConvention());
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
③就能访问带参数的Get调用了
//https://localhost:44377/API/Demo/TestApi/GetUrlStrApi?str=abc123
[HttpGet]
public ApiBaseResult GetUrlStrApi(string str)
{
return ReturnApiBaseResult(str);
}