5

私はこれについて多くのトピックを見てきましたが、残念ながら、それぞれのケース (またはそれらのほとんど) は異なるケースだと思います。特に私のコードを機能させることはできないため、特に私のケースについて専門家の意見が欲しいです。他のトピックのいくつかを読んだ後。

状況: MVC 4 アプリケーションと共に WebApi プロジェクトで作成した WebService メソッドに対して、jQuery で Ajax Request 呼び出しを使用しています。

私の 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 にエラーが記録されているかどうかを確認してください。エラーに気付いた場合は、コントローラーがそれらのアセンブリに存在するかどうかを確認する必要があります。

  • EventLog でエラーを表示するには、Web.config で次の変更を行います。

    <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

編集済み:この問題が発生する可能性があるもう 1 つのシナリオは、コントローラーが別のクラス内にネストされている場合です。これは後で修正されたバグでした。

于 2013-05-21T16:30:53.500 に答える
2

わかりました、それで、何が起こっているのかがわかったと思います。完全に定かではありませんが、少なくとも私の問題は修正されました。

Ajax 呼び出しの「データ」フィールドの内容を変更するだけで、データ全体を保持するアプリケーション内のオブジェクトのクラスを作成できました。何らかの理由で、メソッドが「Get(int ID)」という構文を持つことができなかったようです。

代わりに、「Get(オブジェクト)」のようなものを実行し、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 に答える