【问题标题】:How to Reject Get method when QueryString is passed传递QueryString时如何拒绝Get方法
【发布时间】:2016-11-02 05:23:59
【问题描述】:

在 MVC 应用程序中,我当前的路由配置是:

routes.MapRoute(
    "PaymentInformation",
    "PaymentInformation.aspx/{resNum}",
    new { controller = "Reservation", action = "Edit", resNum = UrlParameter.Optional }
);

当我们点击这个 Url 时,它会调用下面提到的方法:https://www.example.com/PaymentInformation.aspx

HttpGet]
[ValidateRequest(true)]
public ActionResult Edit(string resNum)
{
    ReservationPresenter reservationPresenter = new ReservationPresenter();
    return View(reservationPresenter);
}

我想要的是,当 Querystring 被传递(在 GET 方法中)时,不应调用上述相同的方法/操作,我只想显示一条消息。

带有查询字符串的 URL 应该是这样的:https://www.example.com/PaymentInformation.aspx?xyz

谁能告诉我什么是路线配置中的 MapRoute。

简而言之,我们想要的是任何通过 GET 方法发送的带有敏感信息的请求都应该被应用程序拒绝。

【问题讨论】:

  • 如果你不希望方法被命中,请从路由中删除{resNum},并制作方法public ActionResult Edit()

标签: asp.net-mvc url.action urlrewriting.net


【解决方案1】:

我不认为这是你应该走的路,但如果它真的是你想要的,试试下面的:

1) 创建一个 IRouteConstraint 类并实现它,如下所示:

public class NonQueryStringRouteConstraint : IRouteConstraint {
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) {
        return httpContext.Request.QueryString.Count == 0;
    }
}

2) 给路由添加约束:

routes.MapRoute(
    "PaymentInformation",
    "PaymentInformation.aspx/{resNum}",
    new { controller = "Reservation", action = "Edit", resNum = UrlParameter.Optional },
    new { resNum = new NonQueryStringRouteConstraint() }
);

请注意,NonQueryStringRouteConstraint 也会在生成 URL 时执行,因此您可能需要在必要时检查 routeDirection 参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 2015-08-04
    • 2018-07-14
    相关资源
    最近更新 更多