0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【ASP.NET】「リソースが見つかりません」のエラー原因と対応

Posted at

はじめに

同僚がデータ修正ツールを作成することになり、サンプル的に久しぶりに ASP.NET(C#) + MVC + PostgreSQL でテキストボックスにSQLを入力してボタンをクリックすれば、SQLの結果をグリッド(Handsontable)に表示させるだけのアプリケーションを作成したのですが、POSTした際に「リソースが見つかりません」のエラーで嵌りました。

現象

テキストボックスにSQLを入力してボタンをクリックすると、最初はSQLの結果がグリッド(Handsontable)に表示されるし、C#の部分にブレークポイントすればデバッグできるのですが、2回目以降になると「リソースが見つかりません」の例外エラーとなり、エラー詳細としては「GetSQLDataのコントローラーが見つからないか、IControllerを実装していません。」となります。

GetSQLDataというのは、今回MVCのコントローラーで独自に作成したメソッドになります。

ネット検索の対応でも解決できず、メソッド名をGetSQLData2とかGetSQLData3のように名前を変更すると、デバッグでトレースできて表示までできるのですが、やはり2回目以降になると「リソースが見つかりません」のままです。

HomeController.cs
public class HomeController : Controller
{
    // GET: Home
    public ActionResult Index()
    {
        @ViewBag.MsgErrCommException = "通信エラーが発生しました。";

        return View();
    }

    /// <summary>
    // SQL文の実行結果を取得する
    /// </summary>
    /// <returns>結果</returns>
    [HttpPost]
    public JsonResult GetSQLData(SendSQLPostViewDataModels data)
    {
        object result = new { success = false, message = "", resultData = "" };
        try
        {
            ListViewModel vm = new ListViewModel();

            ResultData resultData = vm.GetResultData(data.SQL);
            result = new { success = true, message = "Success", resultData = resultData };
        }
        catch (Exception ex)
        {
            result = new { success = false, message = ex.Message, resultData = "" };
        }

        return Json(result, JsonRequestBehavior.AllowGet);
    }
}
index.cshtml
function preview() {
    let that = this;
    let param = {
        FactryList: null,
        SQL: $("#txtSQL").val(),
    };
    let process = function (data) {
        if (data.success) {
            hot.loadData(data.resultData.Data);
            hot.updateSettings({
                colHeaders: data.resultData.Header
            });
        }
    }
    postAjax('GetSQLData', JSON.stringify(param), process);
}

// PUT用非同期処理
function postAjax(method, data, callback) {
    jQuery.ajax({
        url: method,
        type: 'POST',
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        data: data,
        async: true,
        processData: false,
        cache: false
    }).fail(function (xhr, status, error) {
        let msg = '@ViewBag.MsgErrCommException' + '\n' + xhr.status + ' ' + error;
        alert(xhr.responseText);
    }).done(function (data) {
        if (data.success)
            callback(data);
        else
            alert(data.message);
    });
}

対応

「GetSQLDataのコントローラーが見つからないか、IControllerを実装していません。」というエラーに着目、もしやURLの指定が間違っているのではないかと思い直し下記のように修正してみました。

index.cshtml
postAjax('GetSQLData', JSON.stringify(param), process);
            
postAjax('/Home/GetSQLData', JSON.stringify(param), process);

結果は正解でした。
これにより、2回目以降でも問題なく動作するようになりました。

原因

対応から原因を探れば、URLの指定が間違っていたことになります。Home/Index.cshtml から実行したので、/Home/の指定は不要だとおもったわけです。
しかも、最初だけは正しく動くのですから記載が間違っているとは気が付き難いですよね。

最後に

これもキャッシュのようなものなんでしょうか、Visual Studio上で最初だけは動くからといって正しいと思うのは間違いのもと。ハマりましたね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?