Microsoft.As pNet .OData: значение поиска в кодировке URL в $ filter - PullRequest
0 голосов
/ 06 января 2020

Мы используем Microsoft.As pNet .OData, и наши контроллеры выглядят так:

namespace Backend.api.Process
{
    public class OdataProcessController: ODataController
    {
        private readonly IProcessService _service;

        public OdataProcessController(IProcessService service)
        {
            _service = service;
        }

        [EnableQuery]
        public IHttpActionResult Get()
        {
            return Ok(_service.GetAllProcesses());
        }
    }
}

Однако некоторые из наших процессов имеют имена, которые включают специальные символы (например, "&") , которые должны быть URL-кодированы перед отправкой бэкэнда при поиске. Это не похоже на то, что ASP. Net Odata Framework автоматически обрабатывает это. Поэтому теперь моя задача - убедиться, что строка поиска декодирована бэкендом.

Я рассмотрел расширение конечной точки для приема ODataQueryOptions (см. Ниже), но я не могу понять, как изменить строку фильтра и перемотать его обратно в объект ODataQueryOptions:

    public IHttpActionResult Get(ODataQueryOptions<ProcessModel> queryOptions)
    {
        var allProcesses= _service.GetAllProcesses();
        queryOptions.ApplyTo(allProcesses);
        return Ok(allProcesses);
    }

Является ли мой единственный вариант переписать мою сервисную функцию, чтобы принять параметр фильтра и сам выполнить фильтрацию?

1 Ответ

0 голосов
/ 07 января 2020

Ссылка, предоставленная Эрдемом, дала мне ответ: создать класс атрибута для переопределения функции OnActionExecuting:

using Microsoft.AspNet.OData;
using System;
using System.Web;
using System.Web.Http.Controllers;

namespace Backend.api.Process
{
    public class DecodeFilter : EnableQueryAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var url = actionContext.Request.RequestUri.OriginalString;
            var newUrl = HttpUtility.UrlDecode(url);

            actionContext.Request.RequestUri = new Uri(newUrl);
            base.OnActionExecuting(actionContext);
        }
    }
}

, а затем использовать его следующим образом:

    [EnableQuery]
    [DecodeFilter]
    public IHttpActionResult Get()
    {
        return Ok(_service.GetAllProcesses());
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...