Web Api控制器认为它是重复的

时间:2014-06-27 09:21:13

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

我有一个webforms应用程序,其中有一些Web Api控制器用于集成。 两个工作正常。但今天我想添加另一个控制器。

应该很简单,我添加一个新的Web Api控制器,为它添加一些代码,并且:

namespace MyApp.Web.App_Code
{
    public class AuthExportController : ApiController
    {
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
    }
 }

当我在这个网址上调用它时:

http://localhost:30978/MyApp/api/AuthExport

我收到此错误:

<Error>
    <Message>An error has occurred.</Message>
    <ExceptionMessage>Multiple types were found that match the controller named  
    'AuthExport'. This can happen if the route that services this request  
    ('api/{controller}/{id}') found multiple controllers defined with the same name but 
    differing namespaces, which is not supported. The request for 'AuthExport' has found 
    the following matching controllers: MyApp.Web.App_Code.AuthExportController  
    MyApp.Web.App_Code.AuthExportController</ExceptionMessage>

    <ExceptionType>System.InvalidOperationException</ExceptionType>

    <StackTrace> at  
    System.Web.Http.Dispatcher.DefaultHttpControllerSelector.SelectController(HttpRequestMessag
    e request) at   
    System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage 
    request, CancellationToken cancellationToken) at 
    System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage  
    request, CancellationToken cancellationToken)</StackTrace>
</Error>

正如您所看到的,它抱怨2个控制器具有相同的名称,但它的控制器完全相同。我的其他控制器工作正常,只是这个。

如果它有帮助,这是我在global.asax

中的路由代码
protected void Application_Start(object sender, EventArgs e)
{
    RouteTable.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = System.Web.Http.RouteParameter.Optional }
    );

    GlobalConfiguration.Configuration.Formatters.Clear();
    GlobalConfiguration.Configuration.Formatters.Add(new XmlMediaTypeFormatter());
}

让我发疯!

更新

好的,我设法解决了,但我不明白为什么,所以如果有人可以向我解释。 我比较了我的工作控制器和我的工作控制器。 完全相同的签名,没有什么不同,相同的使用语句,相同的继承等。 我注意到的一件事是对文件的构建操作。 工作文件具有&#34;内容&#34;的构建操作。非工作有一个构建动作&#34;编译&#34; 。我将我的非工作改为&#34;内容&#34;它的工作原理。

所以现在我更加困惑:)很高兴它有效,但我不喜欢我系统中的黑魔法

2 个答案:

答案 0 :(得分:26)

<强> TL; DR:

删除项目文件目录中的bin文件夹,然后重新构建项目。

<强>解释

我在重命名现有项目并更改其名称空间时遇到此错误,这就是发生的事情:

让我们说项目&#39;名称为FirstName,我想将其重命名为SecondName

  • 我构建了编译所有内容并生成bin/Debug/FirstName.dll个文件
  • 的项目
  • 我将项目重命名为SecondName
  • 我重构了名称空间
  • 建立并运行项目
  • 生成bin/Debug/SecondName.dll

当项目运行时,IIS Express会简单地获取所有.dll个文件并将其加载到内存中,这恰好包括FirstName.dllSecondName.dll

正如您可能已经了解的那样,FirstName.dllSecondName.dll具有相同的类和方法,但具有不同的命名空间! 因此,由于两个DLL都是由IIS加载到内存中的,因此WebApi路由机制正在查找具有相同控制器和操作名称的两个命名空间。

你有它。毕竟没有伏都教魔法:)

答案 1 :(得分:0)

我不得不更改引用,项目和解决方案的名称,之后我就遇到了这个问题好几天了。 当我寻找解决方案时,我在任何地方都得到了删除 / bin 文件夹内容并尝试重建解决方案的答案,我这样做但这并没有解决我的问题。我创建了一个单独的解决方案添加了所有这个解决方案中的项目 bin 文件夹为空,并且构建解决方案仍然无法解决我的问题。 以下是我要回到正轨的事情:

  • 首先从项目/属性/
  • 更改了程序集名称
  • 已清除 / bin / bin / debug 文件夹

  • 清除每个项目的 / obj / debug /(。dll,.cache,临时创建的文件)

然后重建解决方案,最后解决了。 如果仅删除/ bin无效,请尝试此操作。