当前位置: 首页 > 编程语言 > C#

转换自定义操作过滤器以供WebAPI使用?Share

时间:2023-04-10 19:01:44 C#

转换自定义操作过滤器以供WebAPI使用?我发现了一个非常好的动作过滤器,它将逗号分隔的参数转换为泛型类型列表:http://stevescodingblog.co.uk/fun-with-action-filters/我想使用它,但它没有工作ApiController,它完全忽略它。[AttributeUsage(AttributeTargets.Method)]publicclassSplitStringAttribute:ActionFilterAttribute{publicstringParameter{get;放;}公共字符串定界符{得到;放;}publicSplitStringAttribute(){分隔符=",";}publicoverridevoidOnActionExecuting(ActionExecutingContextfilterContext){if(filterContext.ActionParameters.ContainsKey(this.Parameter)){stringvalue=null;varrequest=filterContext.RequestContext.HttpContext.Request;如果(filterContext.RouteData.Values.ContainsKey(this.Parameter)&&filterContext.RouteData.Values[this.Parameter]是字符串){value=(string)filterContext.RouteData.Values[this.Parameter];}elseif(request[this.Parameter]isstring){value=request[this.Parameter]asstring;}varlistArgType=GetParameterEnumerableType(filterContext);如果(listArgType!=null&&!string.IsNullOrWhiteSpace(value)){string[]values=value.Split(Delimiter.ToCharArray(),StringSplitOptions.RemoveEmptyEntries);varlistType=typeof(List).MakeGenericType(listArgType);动态列表=Activator.CreateInstance(listType);foreach(variteminvalues){try{dynamicconvertedValue=TypeDescriptor.GetConverter(listArgType).ConvertFromInvariantString(item);list.Add(convertedValue);}catch(Exceptionex){thrownewApplicationException(string.Format("Couldnotconvertsplitstringvalueto'{0}'",listArgType.FullName),ex);}}filterContext.ActionParameters[this.Parameter]=list;}}base.OnActionExecuting(filterContext);}privateTypeGetParameterEnumerableType(ActionExecutingContextfilterContext){varparam=filterContext.ActionParameters[this.Parameter];varparamType=param.GetType();varinterfaceType=paramType.GetInterface(typeof(IEnumerable).FullName);输入listArgType=null;if(interfaceType!=null){vargenericParams=interfaceType.GetGenericArguments();if(genericParams.Length==1){listArgType=genericParams[0];}}返回列表参数类型;你为ActionFilterAttribute使用什么命名空间?对于WebAPI,您需要使用System.Web.Http.Filters命名空间而不是System.Web.Mvc编辑这是一个粗略的转换,没有经过彻底测试。SplitStringAttribute使用系统;使用System.Collections.Generic;使用System.ComponentModel;使用System.Net.Http;使用System.Web.Http.Controllers;使用System.Web.Http.Filters;命名空间StackOverflowSplitStringAttribute.Infrastructure.Attributes{[AttributeUsage(AttributeTargets.Method)]publicclassSplitStringAttribute:ActionFilterAttribute{publicstringParameter{get;放;}公共字符串定界符{得到;放;}publicSplitStringAttribute(){分隔符=",";}publicoverridevoidOnActionExecuting(HttpActionContextfilterContext){if(filterContext.ActionArguments.ContainsKey(Parameter)){varqs=filterContext.Request.RequestUri.ParseQueryString();如果(qs.HasKeys()){var值=qs[参数];varlistArgType=GetParameterEnumerableType(filterContext);如果(listArgType!=null&&!string.IsNullOrWhiteSpace(value)){string[]values=value.Split(Delimiter.ToCharArray(),StringSplitOptions.RemoveEmptyEntries);varlistType=typeof(List).MakeGenericType(listArgType);动态列表=Activator.CreateInstance(listType);foreach(variteminvalues){try{dynamicconvertedValue=TypeDescriptor.GetConverter(listArgType).ConvertFromInvariantString(item);list.Add(convertedValue);}catch(Exceptionex){thrownewApplicationException(string.Format("Couldnotconvertsplitstringvalueto'{0}'",listArgType.FullName),ex);}}filterContext.ActionArguments[参数]=列表;}}}base.OnActionExecuting(filterContext);}privateTypeGetParameterEnumerableType(HttpActionContextfilterContext){varparam=filterContext.ActionArguments[Parameter];varparamType=param.GetType();varinterfaceType=paramType.GetInterface(typeof(IEnumerable).FullName);输入listArgType=null;if(interfaceType!=null){vargenericParams=interfaceType.GetGenericArguments();if(genericParams.Length==1){listArgType=genericParams[0];}}返回列表参数类型;}}}使用System.Web.Http的CsvController;使用System.Collections.Generic;使用StackOverflowSplitStringAttribute.Infrastructure.Attributes;namespaceStackOverflowSplitStringAttribute.Controllers{publicclassCsvController:ApiController{//GET/api/values[SplitString(Parameter="data")]publicIEnumerableGet(IEnumerabledata){返回数据;}}}示例请求http://localhost:52595/api/csv?data=this,is,a,test,joe这是另一种方式:publicclassConvertCommaDelimitedList:CollectionModelBinder{publicoverrideboolBindModel(HttpActionContextactionContext,ModelBindingContextbindingContext){var_queryName=HttpUtility.ParseQueryString(actionContext.Request.RequestUri.Query)[bindingContext.ModelName];列表_model=新列表();如果(!String.IsNullOrEmpty(_queryName))_model=_queryName.Split(',').ToList();varconverter=TypeDescriptor.GetConverter(typeof(T));如果(转换器!=null)bindingContext.Model=_model.ConvertAll(m=>(T)converter.ConvertFromString(m));elsebindingContext.Model=_model;返回真;}}并在ApiControllerActionMethod中列出你的参数:[ModelBinder(typeof(ConvertCommaDelimitedList))]ListStudentIds=null)其中StudentIds是查询字符串参数(&StudentIds=1,2,4)以上是C#学习教程:Convertcustomaction过滤WebAPI消费?分享的所有内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: