GetControllerMapping在WebApi2中返回一个空集合

时间:2014-01-13 12:56:08

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

我正致力于创建REST API。

我把一些简单的东西放在一起使用WebApi。

然后我发现我无法从域外调用它,所以我查找了该怎么做并找到了this article on ASP.net。 WebApi中似乎没有config.EnableCors()方法,但该文章是为WebApi2编写的,因此我卸载了所有软件包并将其替换为v2对应软件。

在进行任何CORS更改之前,我尝试过测试API。我一直收到404错误。调试显示我正在使用API​​,问题是调用GetControllerMapping()。有了WebApi v1软件包,就返回了一个5控制器的集合。 用v2版本替换它们时,调用返回一个空集合。

控制器部分方法如下所示......

    public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
    {
        var controllers = GetControllerMapping(); // <=== This is the line that returns an empty collection
        var routeData = request.GetRouteData();
        var controllerName = (string)routeData.Values["controller"];
        HttpControllerDescriptor result = null;

        if (!controllers.TryGetValue(controllerName, out result))
        {
            string version;
            if (!GetVersionFromMediaType(request, out version))
            {
                if (!GetVersionFromAcceptHeaderVersion(request, out version))
                {
                    if (!GetVersionFromHeader(request, out version))
                    {
                        if (!GetVersionFromQueryString(request, out version))
                        {
                            version = V_LATEST;
                        }
                    }
                }
            }

            HttpControllerDescriptor versionedDescriptor;

            var newName = string.Concat(controllerName, "V", version);
            if (controllers.TryGetValue(newName, out versionedDescriptor))
            {
                result = versionedDescriptor;
            }
        }

        return result;
    }

各种“GetVersion *”方法只返回true / false,具体取决于他们是否找到了相关数据并将tat数据放入out version参数。

FWIW,我可以看到服务在启动时注册路由。

显然,我错过了一些东西,但到目前为止,我还没有找到任何可以解释它是什么的文档。

有人可以提出任何建议吗?

1 个答案:

答案 0 :(得分:1)

检查“控制器”,如果你的控制器具有相同的名称,即使在不同的命名空间中,此方法也不会返回它们。