asp.net core 2可选属性路由参数+中的+结果为404

问题描述 投票:2回答:1

修复更新

似乎我没有足够重视实际的错误,这是404.11,这意味着它不允许allowDoubleEscaping所以我不得不将web.config添加到我的项目并将其设置为以下

<?xml version="1.0" encoding="utf-8"?>
 <configuration>
  <system.webServer>
  <security>
    <requestFiltering allowDoubleEscaping="true" />
  </security>
 </system.webServer>
</configuration>

我有以下属性路由

[Route("home/coin/{symbol:alpha}/{name:alpha?}")]
public IActionResult Symbol(string symbol, string name)

如果我导航到/home/coin/mysymbol然后它工作,如果我有/home/coin/mysymbol/myname这也有效,但是如果我有/home/coin/mysymbol/myname+moreofname然后它导致404 Not Found,正在传递的name参数是URL编码所以任何空格都变为+

UPDATE控制器的其余部分(代码被剥离)

public class HomeController : BaseController
{

    private readonly IViewRenderService _viewRenderService;

    public HomeController(CryptoDateContext context, IConfiguration configuration,
        IViewRenderService viewRenderService, IOptions<GeneralSettings> generalSettings, ILogger<BaseController> logger)
        : base(context, configuration, generalSettings, logger)
    {
        logger.LogDebug("Base controller ctor called");
        _viewRenderService = viewRenderService;

    }

    public IActionResult Sitemap()
    {


    }

    public async Task<IActionResult> SymbolSitemap()
    {

    }




    [ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]
    public IActionResult GetSearchResults(SearchCriteria criteria)
    {


    }
    public IActionResult Index()
    {

    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult AddEvent(SubmitEventModel model)
    {

    }


    public IActionResult SubmitEvent(int? id)
    {

    }

    public IActionResult DownloadICS(int id)
    {



    }
    [HttpPost]
    [ServiceFilter(typeof(ValidateReCaptchaAttribute))]
    public IActionResult SubmitContactus(ContactUsModel model)
    {

    }

    public IActionResult Contribute()
    {


        return View();
    }
    public IActionResult Telegram()
    {


        return View();
    }
    [Route("home/event/{id:int}/{title?}")]
    public IActionResult Event(int id, string title = null)
    {

    }
    [Route("home/coin/{symbol:alpha}/{name?}")]
    public IActionResult Symbol(string symbol, string name = null)
    {

    }

    public IActionResult Contact()
    {

    }

    public IActionResult Error()
    {
        return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
    }
    public IActionResult Exception()
    {
        throw new Exception("Testing");
    }
}
c# asp.net-core asp.net-core-mvc asp.net-core-routing
1个回答
0
投票

如果您只是替换+和其他特殊字符怎么办?使用如下功能:

public string ClearnUrl(string title)
        {
            string cleanTitle = title.ToLower().Replace(" ", "-");
            //Removes invalid character like .,-_ etc
            cleanTitle = Regex.Replace(cleanTitle, @"[^a-zA-Z0-9\/_|+ -]", "");
            cleanTitle = cleanTitle.Replace("/", "");
            return cleanTitle;
        }
© www.soinside.com 2019 - 2024. All rights reserved.