5

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

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

我的 WebService 控制器类看起来像默认的,像这样:

public class AdditionalInfoController : ApiController
{
    //GET api/AdditionalInfo
    public IEnumerable<string> 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'."
}"

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

最好的问候,
疯狂

4

4 回答 4

12

查看错误看起来 Web API 无法找到控制器“类型”AdditionalInfo。Web API 使用程序集解析器来扫描程序集并找出控制器类型。在您的情况下,由于某种原因,它无法找到您的“AdditionalInfo”控制器,可能是因为它在加载具有此控制器的程序集时遇到了一些问题。

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

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

    <system.diagnostics> <trace autoflush="false" indentsize="4"> <listeners> <add name="myListener" type="System.Diagnostics.EventLogTraceListener" initializeData="WebApiDiagnostics" /> </listeners> </trace> </system.diagnostics>

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

       IAssembliesResolver assembliesResolver = config.Services.GetAssembliesResolver();
    
        ICollection<Assembly> 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());
        }
    

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

已编辑:您可能遇到此问题的另一种情况是您的控制器是否嵌套在另一个类中。这是一个稍后修复的错误。

于 2013-05-21T16:30:53.500 回答
2

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

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

相反,我做了类似“Get(object)”之类的操作,并在 Ajax 请求中做了类似“data: obj.ID”之类的操作,瞧,它奏效了。

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

希望这对将来的人也有帮助。

最好的问候,
疯狂

于 2013-05-23T08:11:53.233 回答
0

确保在方法(int id)以及 WebApiConfig/RouteConfig 中具有相同的参数名称。换个试试

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

public string Get(int? id = null)
{
    return "hello";
}
于 2014-05-22T16:04:28.490 回答
0

我有同样的问题。对我来说,这是由于对视觉工作室(2012)的迷恋而发生的。我在 Visual Studio 中打开了控制器文件,但它不是我的解决方案的一部分 - 我在解决方案资源管理器的控制器目录中找不到他。

我刚刚通过右键单击控制器目录 => 添加 => 现有项目将文件添加到解决方案中。

这为我解决了这个问题。

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

于 2015-04-01T06:15:09.917 回答