WebApi硬编码控制器路由

时间:2016-03-23 11:28:05

标签: c# asp.net-web-api routes self-host-webapi

我正在尝试编写自托管的WebAPI服务器。我希望所有路由都转到一个控制器。该控制器可以选择URL的控制器部分并使用它来决定适当的响应。

我有以下路线配置:

_configuration.Routes.MapHttpRoute
(
    name: "DefaultApi",
    routeTemplate: string.Concat("api/Home", "/{id}"),
    defaults: new { id = RouteParameter.Optional, controllerName="Home" }
);

我的控制器类叫做“HomeController”。我正在尝试将所有网址重定向到它。

以下是HomeController的代码。现在我已经注释掉了对外部逻辑(遥控器)的调用。它应该只是在Get动作上返回一个字符串。

public class HomeController : ApiController
{
    private IExternalController<string> remoteController;

    public HomeController()
    {
        remoteController = GlobalKernelConfiguration.GetStandardKernel().Get<IExternalController<string>>();
    }

    public string Get()
    {
        return "HELLO FROM INTERNAL"; //remoteController.Get();
    }

    public string Get(int id)
    {
        return remoteController.Get(id);
    }

    public void Delete(int id)
    {
         remoteController.Delete(id);
    }

    public void Post(string value)
    {
        remoteController.Post(value);
    }

    public void Put(int id, string value)
    {
        remoteController.Put(id, value);
    }
}

我希望http://localhost:9000/api/[AnythingHere]能够路由到家庭控制器,但在尝试以下网址时出现以下错误:http://localhost:9000/api/Home

{“消息”:“找不到与请求URI'http://loca匹配的HTTP资源 lhost:9000 / api / Home'。“,”MessageDetail“:”没有提供控制器名称的路由  发现匹配请求URI'http://localhost:9000/api/Home'“}

1 个答案:

答案 0 :(得分:1)

正如@CodeCaster在评论中建议的那样,问题是由于路由选项中没有使用正确的参数引起的。

这就是我之前的事情

_configuration.Routes.MapHttpRoute ( name: "DefaultApi", routeTemplate: string.Concat("api/Home", "/{id}"), defaults: new { id = RouteParameter.Optional, controllerName="Home" } );

这就是我现在所拥有的:

        public static void AddControllerRoute(string controllerName)
    {
        _configuration.Routes.MapHttpRoute
           (
               name: "DefaultApi",
               routeTemplate: string.Concat("api/Home", "/{id}"),
               defaults: new { id = RouteParameter.Optional, controller ="Home" }
           );
    }

注意defaults参数已更改,现在使用“controller”而不是“controllerName”,这解决了问题,现在它正在运行。