我已尝试在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,它允许我查看在启动时创建的路由,并且我可以看到我的命名路由存在于集合中。
答案 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依赖项将不正确的类型加载到无法解析路由表的内存中。