2013-06-05 3 views
2

Я сопоставляюсь URLs в моем приложении ASP.NET, как показано ниже:ASP.NET MapRoute с точным ограничением соответствия

 context.MapRoute(
      "Product_v1_DataExchange", 
      "v1/xch", 
      new { controller = "Data", action = "Exchange" }); 

     context.MapRoute(
      "Product_v1_Register", 
      "v1/register", 
      new { controller = "Registration", action = "Register" }); 

Я хочу только следующие ссылки на работу:

http://servername/v1/xch 
http://servername/v1/register 

Но следующие адреса также работает нормально:

http://servername/v1/xch?test 
http://servername/v1/register/?*e/ 
http://servername/v1//./register/./?* 

Как я могу установить ограничение, чтобы разрешены только определенные статические URL?

+0

Что вы хотите достичь для URL-адресов с строки запроса? ошибка 404 или перенаправление 302 на URL-адрес без запроса? (или сопоставление другого маршрута?) – jbl

+0

Да, это должно быть 404, если URL-адреса отличны от упомянутых статических URL-адресов. –

ответ

2

Создать новую RouteConstraint вроде этого:

public class ExactMatchConstraint : IRouteConstraint 
{ 
    private readonly bool _caseSensitive; 

    public ExactMatchConstraint(bool caseSensitive = false) 
    { 
     this._caseSensitive = caseSensitive; 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     return 0 == String.Compare(route.Url.Trim('/'), httpContext.Request.RawUrl.Trim('/'), !this._caseSensitive); 
    } 
} 

Затем использовать:

routes.MapRoute(
     "Custom", 
     "My/Custom", 
     new { controller = "Home", action = "Custom" }, 
     new { exact = new ExactMatchConstraint(/*true for case-sensitive */) } 
    ); 

Результаты:

/My/Custom (200 OK) 
/My/Custom/ (200 OK) 

/My/Custom/k (404 NOT FOUND) 
/My/Custom/k/v (404 NOT FOUND) 
/My/Custom/? (404 NOT FOUND) 
/My/Custom/?k=v (404 NOT FOUND) 
Смежные вопросы