c# - asp.net在url重写后获取查询字符串值

标签 c# asp.net iis url-rewriting

我使用iis url重写, 我添加了这条规则

<rule name="rewrite to details pages" stopProcessing="true">
    <match url="^details/([0-9]+)" />
    <action type="Rewrite" url="pages/details.aspx?id={R:1}" />
</rule>

重写此网址:

/pages/details.aspx?id=12

/details/12

因此,在请求新网址:/details/12后,尝试使用以下代码获取查询字符串:

protected void Page_Load(object sender, EventArgs e)
{
    try
    {
        long itemid;
        if (long.TryParse(Request.QueryString["id"], out itemid))
        {
           // value is null
        }
        else
        {
            Response.Redirect("default.aspx");
        }
    }
    catch
    {
        Response.Redirect("default.aspx");
    }
}

我无法获得任何值

我也尝试过:

protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            //var rawURl = Request.RawUrl;
            //Uri currentUrl = new Uri(Request.Url.GetLeftPart(UriPartial.Authority) + Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"]);

            Uri theRealURL = new Uri(HttpContext.Current.Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.RawUrl);
            string yourValue = HttpUtility.ParseQueryString(theRealURL.Query).Get("id"); 

            long itemid;
            if (yourValue , out itemid))
            {
               // no query strings
            }
            else
            {
                Response.Redirect("default.aspx");
            }
        }
        catch
        {
            Response.Redirect("default.aspx");
        }
    }

但是 RealURL 没有任何查询字符串! 调试结果:

{http://localhost:46476/pages/details.aspx}

那么重写 url 后如何获取查询字符串?

最佳答案

如果您访问/details/12,您应该能够在details.aspx 页面上使用Request.QueryString["id"] 并检索值“12”。我在本地测试过,它对我有用。您还有其他可能会产生干扰的规则吗?

还要确保您已安装最新的 IIS 重写:http://www.iis.net/downloads/microsoft/url-rewrite .

我使用以下代码在本地运行它:

web.config:

...
<system.webServer>
<rewrite>
  <rules>
    <rule name="rewrite to details pages" stopProcessing="true">
      <match url="^details/([0-9]+)" />
      <action type="Rewrite" url="details.aspx?id={R:1}" />
    </rule>
  </rules>
</rewrite>
</system.webServer>
...

详细信息.aspx:

<h1>Details Page</h1>
<strong>ID:</strong> <asp:Literal ID="litId" runat="server" />

details.aspx.cs

public partial class details : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e) {
        try {
            long itemid = -1;
            string req = Request.QueryString["id"];
            if (long.TryParse(req, out itemid)) {
                litId.Text = itemid.ToString();
            }
            else {
                litId.Text = "Couldn't parse!";
            }
        }
        catch (Exception ex){
            litId.Text = "An error occured:" + ex.Message;
        }
    }
}

现在,如果我访问/details/12345,页面将显示:

详细信息页面

ID:12345

如果这对您不起作用,则可能是其他原因干扰了您的重写,或者您的 IIS 设置与我的不同。

我不需要在我的开发服务器上执行此操作,但您可以尝试将 appendQueryString="true" 附加到您的 web.config 规则中。例如

<action type="Rewrite" url="details.aspx?id={R:1}" appendQueryString="true" />

关于c# - asp.net在url重写后获取查询字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38420435/

相关文章:

c# - 以编程方式从 Azure 网站内部检索站点 URL

javascript - 如何替换 VS2010 javascript 文件

c# - 缓慢的 ASP.NET 映射处理程序 - 编译 ASP.NET

http - 如何访问 IIS 服务器管理器中的请求监视器?

html - 按钮与列中缺少边框的下拉列表对齐

asp.net - 如何查找 IIS 功能的名称

c# - 枚举作为类属性

c# - 是不是违反了c#接口(interface)的设计原则?

c# - 在 LINQ 中使用数组查询的位置

c# - 实体对象数据源和 Enum 类型字段上的 where 子句