Web API:在路径集合中找不到名为“X”的路径

时间:2017-06-28 09:37:23

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

我已尝试在Stackoverflow和互联网上的其他地方找到所有解决此错误的解决方案,但我们仍然遇到问题。

所以我们有.NET API,它有一个POST方法,然后返回一个CreatedAtRoute响应(201)。问题是当返回CreatedAtRoute响应时,我们得到错误“在路径集合中找不到名为'X'的路径。”,其中X是我们路线的名称。

Global.asax

protected void Application_Start()
{
    GlobalConfiguration.Configure(WebApiConfig.Register);
    GlobalConfiguration.Configuration.UseStructureMap<MasterRegistry>();

    var allDirectRoutes = WebApiConfig.GlobalObservableDirectRouteProvider.DirectRoutes;
}

WebApi.config - 我们在默认路由之前声明了MapHttpAttributes。

public static class WebApiConfig
{
    public static ObservableDirectRouteProvider GlobalObservableDirectRouteProvider = new ObservableDirectRouteProvider();

    public static void Register(HttpConfiguration config)
    {
        config.Formatters.Clear();
        config.Formatters.Add(new JsonMediaTypeFormatter());

        // Web API routes

        config.MapHttpAttributeRoutes(GlobalObservableDirectRouteProvider);

        config.Routes.MapHttpRoute(
            "DefaultApi",
            "api/v1/{controller}/{id}",
            new { id = RouteParameter.Optional }
        );
    }
}

Controller - GetCompoundById路由 这是我们想要使用命名路由构建的路由

[HttpGet]
[Route("{id:Guid}", Name = "GetCompoundById")]
[SwaggerResponse(HttpStatusCode.OK, Type = typeof(CompoundViewModel))]
public async Task<IHttpActionResult> Get(Guid id)
{
    var serviceResult = await Task.FromResult(CompoundService.Get(id));

    if (serviceResult == null)
    {
        return NotFound();
    }

    CompoundViewModel result =
            new CompoundViewModel {Id = serviceResult.Id, Name = serviceResult.Name};

    return Ok(result);
}

Controller - 在POST操作中返回CreatedAtRoute 这是抛出错误的地方,因为找不到指定的路由。

return CreatedAtRoute("GetCompoundById", new {id = result.Id}, result);

注意:在WebApi.config中,我创建了一个ObservableDirectRouteProvider,它允许我查看在启动时创建的路由,并且我可以看到我的命名路由存在于集合中。 enter image description here

2 个答案:

答案 0 :(得分:0)

如果我们在控制器上使用路由前缀,我们应该为所有操作定义路由名称。使用此

[HttpGet]
[Route(Name = "GetCompounds")]
[SwaggerResponse(HttpStatusCode.OK, Type = typeof(IEnumerable<ApiModels.CompoundViewModel>))]
public async Task<IHttpActionResult> Get(int page = 0,int pageSize = CoreModels.Pagination.DefaultPageSize)

答案 1 :(得分:0)

这个问题与我们使用命名路由或配置WebAPI路由的方式没有直接关系(这解释了为什么所有其他帖子都没有帮我修复它)。我们发现问题是我们如何使用StructureMap作为IoC容器的副作用。

在我们调用的StructureMap注册表中

scanner.SingleImplementationsOfInterface();

导致错误的奇怪副作用。通过执行一个非常漫长而乏味的消除过程,我将其追踪到这个确切的行。删除路由后,再次按预期工作。我只能假设这导致一些WebApi依赖项将不正确的类型加载到无法解析路由表的内存中。