ASP.net Web API 2路由:不同的路由保持相同的控制器和方法

时间:2019-03-22 08:14:27

标签: c# asp.net-web-api routing

我的团队正在为我们的移动应用设置e2e tests,他们希望模拟一些响应(例如,简单的响应200500,缓慢的api响应等等)复杂的东西)。

在移动应用中,我们的服务器URL是全局VAR,对于每个请求,我们都会附加特定的路由,例如:

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

由于在运行e2e路由的e2e时更新一个全局变量(即serverURL)要容易得多,因此看起来很简单。像这样(例如,针对模拟错误):

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

基本上,我们只是在修改serverURL,并且特定api调用的URL保持不变。

这是我现在得到的:

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
    }
 }

正在发生的事情是,当我输入以下URL时,第二个控制器SavedController(包含实际代码的那个)被击中了:

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方法。

有人可以帮我解决这个问题吗?

0 个答案:

没有答案