修复更新
似乎我没有足够重视实际的错误,这是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");
}
}
如果您只是替换+和其他特殊字符怎么办?使用如下功能:
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;
}