当前位置: 首页 > 知识库问答 >
问题:

使用ApiController时找不到WebAPI路由。HttpServer内的Url

澹台季萌
2023-03-14

我很少有使用 Web API 1 正常工作的集成测试,在升级到 Web API 2 (5.0) 后,它们不起作用,并且在调用以下代码时为我提供了空引用:

string uri = Url.Link(HttpRouteConstants.RouteName, new { param1 =
paramValue1, param2 = paramValue2 });

基本上 Url.Link 找不到路线(至少我认为这是问题所在)。我认为问题出在HttpConfiguration的方式上

WebApiConfig.Register(config)

GlobalConfiguration.Configure(WebApiConfig.Register);

现在,当使用集成测试设置时,我为HttpServer提供HttpConfiguration实例,我不能调用GlobalConfiguration.Configure(WebApiConfig.Register)之类的东西;但我使用的是旧方法并执行以下WebApiConfig.Register(config),这似乎无法正常工作。仅供参考,我的路由配置被放置在 WebApiConfig 中。

有谁知道任何解决方法?

这是我正在使用的堆栈:

    < li >与2013年相比(。NET 4.5.1) < li>WebAPI 2(基于约定的路由

更新

这是联调代码示例

// Create configuration
HttpConfiguration config = new HttpConfiguration();

config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;            
config.DependencyResolver = new NinjectDependencyResolver(Kernel);

//WebApiConfig.Register(config); Below is the excerpt from WebApiConfig
config.EnableCors((System.Web.Http.Cors.ICorsPolicyProvider)config.DependencyResolver.GetService(typeof(System.Web.Http.Cors.ICorsPolicyProvider)));

config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
    name: HttpRouteConstants.ApplicationAPIRouteName,
    routeTemplate: CoreRouteConstants.DefaultApplicationControllerRoute + "/{id}",
    defaults: new { id = RouteParameter.Optional }
);

config.Routes.MapHttpRoute(
    name: HttpRouteConstants.DefaultAPIRouteName,
    routeTemplate: CoreRouteConstants.DefaultControllerRoute + "/{id}",
    defaults: new { id = RouteParameter.Optional }
);


HttpServer server = null;
try
{
  server = new HttpServer(config);
}
catch (Exception ex)
{
  throw ex;
}

string controller = String.Format("{0}{1}/api/MyController/{2}/", HttpServerBaseAddress, param1, param2);
var client = new HttpClient(Server);
using (HttpResponseMessage response = client.DeleteAsync(controller, new CancellationTokenSource().Token).Result)
{
    response.IsSuccessStatusCode.Should().BeFalse();
    response.StatusCode.Should().Be(HttpStatusCode.NotFound);
}

//Below is the code from MyController
public virtual async Task<HttpResponseMessage> DeleteAsync([FromUri]object key)
{
    HttpResponseMessage response = null;
    HttpStatusCode statusCode = HttpStatusCode.OK;
    bool result = await Store.DeleteAsync(key);
    if (!result)
        statusCode = HttpStatusCode.NotFound;
    response = Request.CreateResponse<bool>(statusCode, result);
    string uri = Url.Link(HttpRouteConstants.ApplicationAPIRouteName, new { param1 = "param1", id = key });
    //NOTE: uri is null here as I mentioned 
    response.Headers.Location = new Uri(uri);
    return response;
}

谢谢。

共有1个答案

燕和裕
2023-03-14

你能分享一下你的集成测试是什么样的吗?我尝试了一个集成测试场景,在那里我能够生成链接,所以我很好奇你的代码是什么样子的。在我的场景中,我没有使用Ninject。

GlobalConfiguration.Configure(WebApiConfig.Register);确保在所有 Web API 配置完成后调用 HttpConfiguration.EnsureInitialized()。

因此,如果您正在联调用WebApiConfig。在您的联调中注册,您可以在Web API配置完成后尝试调用HttpConfiation. Ensure初始化(),看看这是否解决了问题。

 类似资料:
  • 考虑以下事项: 我有一个应用模板,一个HeaderTemboard,和参数化的路由集与相同的处理程序(在应用模板)。我希望在没有找到东西的时候能够服务404路线。例如, /CA/SanFrancisco应该由区域查找和处理,而 /SanFranciscoz应该是404。 下面是我如何快速测试路线的。 问题是 /SanFranciscoz总是由区域页面处理,但我希望它是404。此外,如果我向第一个路

  • 我有一个更新网站的任务。本网站使用Symfony2。我试着在我的localhost上模拟网站。 当我尝试使用空方向路径(REQUEST_URI)到达索引页时,Symfony2返回的路由。我尝试运行的url是。 当我使用(例如)时,它也不起作用 怎么了? app/config/routing。yml: app/配置/routing_dev.yml: src/AppBundle/Resources/c

  • 我正在建立一个注册页,当我提交时,我得到一个404没有找到。我正在使用react和express,我认为前端是好的。我缺少了一些后端,或者我的post请求的url错误:AXIOS.post('http://localhost:3000/auth'。如果有人能看到我的错误之处,我将不胜感激。 这是我的路由的registerPost函数。 这些是路线。

  • 我正在使用youtube上的教程制作一个简单的聊天应用程序(github链接:link)。一个潜在的问题是本教程使用2。django的x版本,但我有3.1。7,但我让它工作得很好,很接近,但随后开始出现以下错误: 当查看我的终端时,它一直试图一遍又一遍地重新连接,可能是因为我使用了重新连接WebSocket github javascript代码。当我运行redis-cli并键入ping时,我得到

  • 问题内容: 我想创建一个使用asp.net mvc webapi作为后端和客户端路由(没有cshtml)的SPA angularjs应用程序中的身份验证和授权的示例。以下只是可用于设置完整示例的函数示例。但是我不能一概而论。任何帮助表示赞赏。 问题: 最佳实践是什么:基于Cookie或令牌? 如何创建有角度的承载令牌以对每个请求进行授权? 验证API函数? 如何在客户端上保留登录的登录用户? 示例

  • null 我已经登记了路线