在Ajax请求期间获取“找不到匹配控制器命名的类型”错误消息

我已经看过很多关于这个问题的主题,但不幸的是我相信每个案例都是一个不同的案例(或大多数案例),我真的很想得到一些专家对我的案例的意见,因为我不能让我的代码工作甚至阅读完一些其他主题后。

情况:我在jQuery中使用Ajax Request调用我在WebApi项目中创建的WebService方法以及MVC 4应用程序。

我的WebService控制器类看起来像默认值,如下所示:

public class AdditionalInfoController : ApiController { //GET api/AdditionalInfo public IEnumerable Get() { return new string[] { "value1", "value2" }; } //GET api/AdditionalInfo/5 public string Get(int id) { return "value"; } //PUT api/AdditionalInfo/5 public void Put(int id) { string test = ""; } } 

来自jQuery的我的Ajax请求如下所示:

 function GetAdditionalInfo(obj) { var request = jQuery.ajax({ url: "/api/AdditionalInfo/Get", type: "GET", data: { id: obj.id }, datatype: "json", async: false, beforeSend: function () { }, complete: function () { } }) .done(function (a,b,c) { alert("Additional info was retrieved successfully!"); }) .fail(function (a,b,c) { alert("An error happened while trying to get the additional info!"); }); } 

我的WebAPIConfig文件如下所示:

 public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); } } 

最后但并非最不重要的是,这是我的问题:当我在.fail中浏览返回的数据变量时,此错误消息一直出现,这就是所写的:

 "{ "Message":"No HTTP resource was found that matches the request URI 'http://localhost:59096/api/AdditionalInfo/Get?id=1'.", "MessageDetail":"No type was found that matches the controller named 'AdditionalInfo'." }" 

如果有人能尽快帮助我,我将非常感激。 提前致谢!

最好的祝福,

查看错误看起来Web API无法找到控制器’类型’AdditionalInfo。 Web API使用程序集解析程序扫描程序集并找出控制器类型。 在你的情况下由于某种原因它无法找到你的’AdditionalInfo’控制器可能是因为加载具有这个控制器的组件有一些问题。

尝试以下操作,查看EventLog中是否记录了任何错误。 如果您发现任何错误,那么您可能应检查这些组件中是否存在控制器。

  • 在Web.config中进行以下更改以查看EventLog中的错误

  • 在WebApiConfig.cs中,您可以执行以下操作:

      IAssembliesResolver assembliesResolver = config.Services.GetAssembliesResolver(); ICollection assemblies = assembliesResolver.GetAssemblies(); StringBuilder errorsBuilder = new StringBuilder(); foreach (Assembly assembly in assemblies) { Type[] exportedTypes = null; if (assembly == null || assembly.IsDynamic) { // can't call GetExportedTypes on a dynamic assembly continue; } try { exportedTypes = assembly.GetExportedTypes(); } catch (ReflectionTypeLoadException ex) { exportedTypes = ex.Types; } catch (Exception ex) { errorsBuilder.AppendLine(ex.ToString()); } } if (errorsBuilder.Length > 0) { //Log errors into Event Log Trace.TraceError(errorsBuilder.ToString()); } 

    顺便说一下,上面的一些代码实际上来自DefaultHttpControllerTypesResolver,Web API使用它来解析控制器类型。 http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Http/Dispatcher/DefaultHttpControllerTypeResolver.cs

编辑 :如果你的控制器嵌套在另一个类中,你可以解决这个问题的另一个场景。 这是一个后来修复的错误。

好的,所以我相信我发现了发生了什么。 我不完全确定,但至少我的问题得到解决。

只需更改Ajax调用中“data”字段内部的内容,我就为应用程序中的对象创建了一个类来保存整个数据。 似乎由于某种原因,该方法不能具有语法“Get(int ID)”。

相反,我做了类似“Get(object)”的东西,在Ajax Request中做了类似“data:obj.ID”的东西,瞧,它起作用了。

此外,由于框架对REST方法(Get,Post,Put和Delete)的名称很挑剔,我将方法的名称更改为其他名称(如Retrieve或其他内容)。

希望这也将有助于未来的某些人。

最好的祝福,

确保方法(int id)和WebApiConfig / RouteConfig中的参数名称相同。 通过改变来尝试

 public string Get(int id) { return "hello"; } 

 public string Get(int? id = null) { return "hello"; } 

我有同样的问题。 与我同在,这是因为视觉工作室的迷恋(2012)。 我在visual studio中打开了控制器文件,但它不是我解决方案的一部分 – 我在解决方案资源管理器的控制器目录中找不到他。

我刚刚通过右键单击controllers directory => add => existing item将文件添加到解决方案中。

这解决了我的问题。

如果不起作用,可以尝试删除控制器并添加一个具有相同代码的新控制器。 。 。