从请求转换波斯数字

时间:2018-10-25 11:56:48

标签: c# asp.net-web-api unicode numbers

在使用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及其表单数据设置过滤器。

2 个答案:

答案 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}.");
    }
}

可以这样做:

enter image description here

作为进一步参考,请参见网络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)