конвертировать персидское число из запроса - PullRequest
0 голосов
/ 25 октября 2018

Как я могу отредактировать все URL запроса и модель данных перед маршрутизацией в 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 голосов
/ 25 октября 2018

Не уверен, что это хорошее решение, но кажется, что оно работает:

Добавить пользовательский фильтр

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)

0 голосов
/ 25 октября 2018

Если я правильно понимаю ваш вопрос, то вам нужен 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

Удачного кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...