ASP.net Web API 2 Маршрутизация: разные маршруты продолжают использовать один и тот же контроллер и метод - PullRequest
0 голосов
/ 22 марта 2019

Моя команда настраивает e2e tests для нашего мобильного приложения, и они хотели бы посмеяться над некоторыми ответами (от простых, таких как 200, 500, медленный ответ API и т. Д. До более сложных вещей).

В мобильном приложении URL нашего сервера является глобальным VAR, и для каждого запроса мы добавляем конкретный маршрут, например:

var serverURL = "https://api.domain.com/"
var getSavedURL = serverURL + "api/saved/GetSaved"

Так как гораздо проще обновить один глобальный var (то есть serverURL)при запуске e2e для маршрутов e2e необходимо искать что-л.вот так (например, для насмешливой ошибки):

var serverURL = "https://api.domain.com/e2e/error/"
var getSavedURL = serverURL + "api/saved/GetSaved"

По сути, мы просто изменяем serverURL, а URL для конкретного вызова API остается прежним.

Вот что я получил намомент:

В WebApiConfig:

    public static void Register(HttpConfiguration config)
    {

        // reporting api versions will return the headers "api-supported-versions" and "api-deprecated-versions"
        config.AddApiVersioning(
            o =>
                {
                    o.AssumeDefaultVersionWhenUnspecified = true;
                    o.ReportApiVersions = true;
                    o.DefaultApiVersion = new ApiVersion(1, 0);
                });

        config.Routes.MapHttpRoute(
            "e2e_ERROR",
            "e2e/error/api/{controller}/{action}"
            );


        config.Routes.MapHttpRoute(
            "VersionedUrl",
            "v{apiVersion}/{controller}/{action}/{id}",
            new { id = RouteParameter.Optional },
            new { apiVersion = new ApiVersionRouteConstraint() });

        config.Routes.MapHttpRoute(
            "Default",
            "api/{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional });

        var appXmlType =
            config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(
                t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);

        config.Formatters.Remove(config.Formatters.XmlFormatter);
        config.EnableSystemDiagnosticsTracing();
    }

Самая важная часть:

            config.Routes.MapHttpRoute(
            "e2e_ERROR",
            "e2e/error/api/{controller}/{action}"
            );

Вот код из моего макета e2e контроллер:

[ApiVersion("3.0")]
[RoutePrefix("e2e/error/api/saved/")]
public class SavedE2EController : ApiController
{
    [HttpGet]
    public  IHttpActionResult GetSaved()
    {
        return Ok();
    }
}

А вот код из контроллера, который подвергается насмешке:

[Authorize]
[ApiVersion("3.0")]
[RoutePrefix("api/saved")]

public class SavedController : ApiController
{
    [HttpGet]
    [ActionName("GetSaved")]
    public async Task<HttpResponseMessage> GetSaved()
    {
        // some code here
    }
 }

Происходит то, что второй контроллер - SavedController (тот, который содержит реальный код) получает удар при входеэтот URL:

http://localhost:7291/e2e/error/api/saved/GetSaved

Я перепробовал множество других конфигураций, но безуспешно, например, изменил RoutePrefix на:

    [RoutePrefix("~e2e/error/api/saved/")]
    [RoutePrefix("~api/saved")]

Или вообще удалил RoutePrefix, или добавил:

  [Route("")]
  [Route("~e2e/error/api/saved/GetSavedWorkouts")]

К e2e методу.

Может кто-нибудь помочь мне разобраться в этом?

...