我有一个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;它的工作原理。
所以现在我更加困惑:)很高兴它有效,但我不喜欢我系统中的黑魔法
答案 0 :(得分:26)
<强> TL; DR:强>
删除项目文件目录中的bin
文件夹,然后重新构建项目。
<强>解释强>
我在重命名现有项目并更改其名称空间时遇到此错误,这就是发生的事情:
让我们说项目&#39;名称为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路由机制正在查找具有相同控制器和操作名称的两个命名空间。
你有它。毕竟没有伏都教魔法:)
答案 1 :(得分:0)
我不得不更改引用,项目和解决方案的名称,之后我就遇到了这个问题好几天了。 当我寻找解决方案时,我在任何地方都得到了删除 / bin 文件夹内容并尝试重建解决方案的答案,我这样做但这并没有解决我的问题。我创建了一个单独的解决方案添加了所有这个解决方案中的项目 bin 文件夹为空,并且构建解决方案仍然无法解决我的问题。 以下是我要回到正轨的事情:
已清除 / bin , / bin / debug 文件夹
清除每个项目的 / obj / debug /(。dll,.cache,临时创建的文件)。
然后重建解决方案,最后解决了。 如果仅删除/ bin无效,请尝试此操作。