如何使用参数将路径重定向到URL?

时间:2019-12-16 18:10:35

标签: c# asp.net-core redirect asp.net-web-api asp.net-core-webapi

我有一个支持分页的端点:api/accounts?pageNumber=1&pageSize=50

    [HttpGet]
    public IActionResult GetAccounts(int pageNumber, int pageSize)
    {
        var accounts = _accountService.GetAccounts(pageNumber, pageSize);

        Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(accounts.GetMetadata()));

        return Ok(accounts);
    }

但是,如果有人从技术上发送bad request,而pageSize太大或根本没有分页参数,那么我不希望发回400 status,而是将其重定向到带有默认参数的正确URL。意思是:

如果有人在浏览器中输入api/accounts,他将被重定向到api/accounts?pageNumber=1&pageSize=50。我希望他在浏览器中看到一个新的URL。另外,如果有人这样做:

api/accounts?pageNumber=1&pageSize=500000000,我想做与上一个示例完全相同的操作,请转到:api/accounts?pageNumber=1&pageSize=50并将其显示在浏览器中。

您能帮我这个忙吗? 谢谢

1 个答案:

答案 0 :(得分:0)

  

如果有人在浏览器中输入api /帐户,他将被重定向到api /帐户?pageNumber = 1&pageSize = 50。我希望他在浏览器中看到一个新的URL。

     

如果有人这样做:api / accounts?pageNumber = 1&pageSize = 500000000,我想做与上一个示例完全相同的操作,请转到:api / accounts?pageNumber = 1&pageSize = 50并显示在浏览器。

要达到上述要求,可以使用URL redirect来参考以下示例。

在Startup.cs中

using (StreamReader iisUrlRewriteStreamReader =
    File.OpenText("IISUrlRewrite.xml"))
{
    var options = new RewriteOptions()
        .AddIISUrlRewrite(iisUrlRewriteStreamReader);

    app.UseRewriter(options);
}

IISUrlRewrite.xml

<?xml version="1.0" encoding="utf-8" ?>
<rewrite>
  <rules>
    <rule name="urrl1" stopProcessing="true">
        <match url="api/accounts" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{QUERY_STRING}" pattern="pageNumber=([0-9]{1,3})&amp;pageSize=(10|50|100)$" negate="true" />
        </conditions>
        <action type="Redirect" url="api/accounts?pageNumber=1&amp;pageSize=50" appendQueryString="false" />
    </rule>
  </rules>
</rewrite>

测试结果

enter image description here