Маршруты сервиса Wcf Web Api конфликтуют с обычными маршрутами asp.net mvc (превью web api 4) - PullRequest
3 голосов
/ 29 августа 2011

Я заметил, что мое приложение MVC создает неправильные URL при использовании:

@using (Html.BeginForm("Test", "Test"))
{
    <input type="submit" value="Submit" />
}

Это сгенерированный источник HTML:

<form action="/books?action=Test&amp;controller=Test" method="post">

Обратите внимание, что действие начинается с /книги .Это НЕПРАВИЛЬНО!

Я заметил, что Html.BeginForm всегда включает в себя начало первого веб-API, который был зарегистрирован в MapServiceRoute.(см. код ниже)

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    var builder = HttpHostConfiguration.Create();
    routes.MapServiceRoute<BooksService>("books", builder);

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );
}

Я потратил много времени, пытаясь выяснить, почему URL-адреса были нарушены в моем приложении, но ни к чему не привели.Затем я решил протестировать его с помощью чрезвычайно простого приложения mvc и, конечно же, проблему легко воспроизвести.Приложение mvc, на котором я это тестировал, настолько простое, насколько возможно, было создано asp mvp.Вы можете найти это здесь .Все, что я сделал, это добавил TestController и представление Views / Test / Index.cshtml.В представлении я добавил Html.BeginForm, показанный выше.Если вы запустите приложение и зайдете на тестовый контроллер, вы увидите, что URL неверен, просто наведя указатель мыши на кнопку отправки (или посмотрите на источник HTML).

Кто-нибудь знает, как избежать этой проблемы?

РЕДАКТИРОВАТЬ : Это относится к предварительному просмотру веб-API 4 (апрель 2011 г.).

Ответы [ 3 ]

4 голосов
/ 30 августа 2011

Другой способ - определить ограничение маршрута:

public class WcfRoutesConstraint : IRouteConstraint {
    public WcfRoutesConstraint(params string[] values) {
        this._values = values;
    }

    private string[] _values;

    public bool Match(HttpContextBase httpContext, Route route, string parameterName,
RouteValueDictionary values, RouteDirection routeDirection) {

    // Get the value called "parameterName" from the
    // RouteValueDictionary called "value"
    string value = values[parameterName].ToString();

    // Return true is the list of allowed values contains
    // this value.
    bool match = !_values.Contains(value);
    return match;
    }
}

Назначение ограничения для маршрутов MVC

routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
        new { controller = new WcfRoutesConstraint(new string[] {"contact","login"}) }
    );

Это не позволяет MVC касаться URL "/ login" и "/ contact"

4 голосов
/ 29 августа 2011

Нашел ответ. Это известная проблема. Гленн Блок опубликовал обходной путь. Я только что проверил, и это действительно решает проблему. Это будет исправлено следующей каплей.

http://codebetter.com/glennblock/2011/08/05/integrating-mvc-routes-and-web-api-routes-2/

0 голосов
/ 02 сентября 2011

В нашем следующем выпуске ветки прототипов мы включили WebApiRoute, который решает эту проблему (используя подход, который я упоминал в своем блоге). MapServiceRoute использует его.

...