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"。我把我的非工作的一个改为"内容",它工作了。
所以现在我更困惑了:)很高兴它的工作,但我不喜欢黑魔法在我的系统
TL;DR:
删除项目文件目录下的bin
文件夹,重新构建项目。
解释:
我在重命名现有项目并更改其命名空间时遇到了这个错误,这是发生的事情:
假设项目名称为FirstName
,我想将其重命名为SecondName
。
- 我构建了一个项目,它编译了所有内容并生成了
bin/Debug/FirstName.dll
文件 - 我将项目重命名为
SecondName
我重构了命名空间 - 构建并运行项目
- 生成
bin/Debug/SecondName.dll
当项目运行时,IIS Express简单地将所有.dll
文件加载到内存中,其中碰巧包括FirstName.dll
和SecondName.dll
。
您可能已经理解,FirstName.dll
和SecondName.dll
具有相同的类和方法,但具有不同的命名空间!因此,由于这两个dll都被IIS加载到内存中,WebApi路由机制发现这两个名称空间具有相同的控制器和操作名称。
就是这样了。根本没有巫术:)
我不得不更改引用,项目和解决方案的名称,之后我有这个问题了几天。当我寻找解决方案时,我得到了删除/bin文件夹内容并尝试重建解决方案的答案,我这样做了,但这并没有解决我的问题。然后我创建了一个单独的解决方案,将所有这些项目添加到bin文件夹空的解决方案中,并且构建解决方案仍然没有解决我的问题。以下是我必须做的事情来回到正轨:
- 首次更改Project/Properties/ 程序集名称<<li>
清除/obj/debug/(.dll, .cache,临时创建的文件)每个项目。
清除strong>/bin , /bin/调试文件夹
然后重建解并最终解出。如果只删除/bin不工作,那么试试这个