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

本文关键字:Api 控制器 Web | 更新日期: 2023-09-27 18:10:34

我有一个webforms应用程序,它有一些Web Api控制器在它的集成。有两个工作得很好。但是今天我想添加另一个控制器。

应该足够简单,我添加了一个新的Web Api控制器,添加了一点代码,和:

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

当我在这个url中调用它时:

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>

正如你所看到的,它抱怨两个同名的控制器,但它是完全相同的控制器。我的其他控制器都很好,只有这个。

如果它有帮助的话,这是我在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());
}

把我逼疯了!

更新:

好的,我设法解决了它,但我不明白为什么,所以如果有人能解释给我听。我比较了工作的控制器和不工作的控制器。完全相同的签名,没有什么不同,相同的using语句,相同的继承等等。我注意到的一件事是文件上的构建操作。工作文件的构建动作为"Content",非工作文件的构建动作为"Compile"。我把我的非工作的一个改为"内容",它工作了。

所以现在我更困惑了:)很高兴它的工作,但我不喜欢黑魔法在我的系统

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

TL;DR:

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

解释:

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

假设项目名称为FirstName,我想将其重命名为SecondName

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

当项目运行时,IIS Express简单地将所有.dll文件加载到内存中,其中碰巧包括FirstName.dllSecondName.dll

您可能已经理解,FirstName.dllSecondName.dll具有相同的类和方法,但具有不同的命名空间!因此,由于这两个dll都被IIS加载到内存中,WebApi路由机制发现这两个名称空间具有相同的控制器和操作名称。

就是这样了。根本没有巫术:)

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

  • 首次更改Project/Properties/
  • 程序集名称<<li>

    清除strong>/bin , /bin/调试文件夹

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

然后重建解并最终解出。如果只删除/bin不工作,那么试试这个