C# Microsoft.AspNet.OData:URL编码的搜索值(以$filter为单位)

C# Microsoft.AspNet.OData:URL编码的搜索值(以$filter为单位),c#,asp.net,odata,C#,Asp.net,Odata,我们使用的是Microsoft.AspNet.OData,我们的控制器如下所示: namespace Backend.api.Process { public class OdataProcessController: ODataController { private readonly IProcessService _service; public OdataProcessController(IProcessService service)

我们使用的是Microsoft.AspNet.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.NETOData框架似乎不会自动处理这个问题。因此,我现在的任务是确保搜索字符串在后端被解码

我已经研究了扩展端点以接受ODataQueryOptions(见下文),但我不知道如何更改筛选器字符串并将其重新包装回ODataQueryOptions对象:

    public IHttpActionResult Get(ODataQueryOptions<ProcessModel> queryOptions)
    {
        var allProcesses= _service.GetAllProcesses();
        queryOptions.ApplyTo(allProcesses);
        return Ok(allProcesses);
    }
public IHttpActionResult获取(ODataQueryOptions查询选项)
{
var allprocesss=_service.getallprocesss();
queryOptions.ApplyTo(所有进程);
返回Ok(所有进程);
}

我唯一的选择是重写我的服务函数来接受过滤器参数并自己实现过滤吗?

Erdem提供的链接给了我答案,即创建一个属性类来覆盖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());
    }

如果我理解正确,您应该创建一个新的HttpRequestMessage来应用。使用filter QueryString构建字符串并创建新的HttpRequestMessage。