在使用C#Web API进行路由之前,如何编辑所有请求的网址和数据模型?
我有一种方法可以将数字从波斯语更改为英语
public static string toEnglishNumber(string input)
{
string[] persian = new string[10] { "۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹" };
for (int j = 0; j < persian.Length; j++)
input = input.Replace(persian[j], j.ToString());
return input;
}
但是我必须为我的所有控制器和值运行此方法。 我想在运行任何控制器之前对url及其表单数据设置过滤器。
答案 0 :(得分:0)
如果我以正确的方式理解您的问题,则需要DelegatingHandler。 可能是这样的:
public class RequestHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
Console.WriteLine(request.RequestUri);
request.RequestUri = new Uri(toEnglishNumber(request.RequestUri.ToString()));
Console.WriteLine(request.RequestUri);
return base.SendAsync(request, cancellationToken);
}
public static string toEnglishNumber(string input)
{
string[] persian = new string[10] { "۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹" };
for (int j = 0; j < persian.Length; j++)
input = input.Replace(persian[j], j.ToString());
return input;
}
}
每个请求首先在处理程序中运行,您可以在其中执行工作人员。 您需要在全球范围内注册:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MessageHandlers.Add(new RequestHandler());
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
对于控制器的简单测试:
public class TestController : ApiController
{
public IHttpActionResult Get(int number)
{
return this.Ok($"Hello World {number}.");
}
}
可以这样做:
作为进一步参考,请参见网络api海报:https://www.asp.net/media/4071077/aspnet-web-api-poster.pdf
编码愉快!
答案 1 :(得分:0)
不确定这是否是一个好的解决方案,但似乎可行:
添加自定义过滤器
public class MyUrlDataFilterAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
var dict = actionContext.ControllerContext.RequestContext.RouteData.Values;
List<string> keyList = new List<string>();
foreach (string key in dict.Keys) keyList.Add(key);
foreach (string key in keyList)
{
string s = dict[key] as string;
if (s != null) dict[key] = toEnglishNumber(s);
}
}
}
和config.Filters.Add(new MyUrlDataFilterAttribute());
中的WebApiConfig.Register(HttpConfiguration config)