Insufficient stack to continue executing the program safely. ASP.NET MVC 4

Obsivus picture Obsivus · May 20, 2013 · Viewed 21.5k times · Source

My search functionality seems to continue in a infinite loop, everytime my debug hits the action below the POST actionresult gets fired.

In my Masterpage.cshtml I have following action:

 <li>@Html.Action("Search", "Search")</li>

This is the part that gets the error of following:

Insufficient stack to continue executing the program safely. This can happen from having too many functions on the call stack or function on the stack using too much stack space.

In my SearchController I have one get and post actionresult methods:

[HttpGet]
        public ActionResult Search()
        {
            return PartialView("SearchFormPartial");
        }

This one returns a partial view that have following content:

@using (Ajax.BeginForm("Search", "Search", FormMethod.Post,
        new AjaxOptions
        {
            InsertionMode = InsertionMode.Replace,
            HttpMethod = "POST"

         }))
{
<div>
    @Html.TextBox("query", "", new { @class = "search-query", @placeholder="Search news...", @spellcheck="false"})
    <input type="submit" value="Search" />
</div>      
}

Its basicly a form with the textbox and submit button.

This is the http post actionresult:

[HttpPost]

    public ActionResult Search(string query)
    {
        if (query != null)
        {
            try
            {

                var searchlist = rep.Search(query);

                var model = new ItemViewModel()
                {
                    NewsList = new List<NewsViewModel>()
                };

                foreach (var NewsItems in searchlist)
                {
                    FillProductToModel(model, NewsItems);
                }


                return View("Searchresults", model);
            }
            catch (Exception e)
            {
                // handle exception
            }
        }
        return View("Error");


    }

It returns a view with a viewmodel that contains the items that matched the query.

When I debug it everything works perfectly but everything seems to be repeated infinitly.

The view for the Searchresult looks like this:

@model Namespace.ViewModels.ItemViewModel
@if (Model.NewsList.Count == 0)
{
    <h3 class="text-error">No items matched your search query!</h3>
}
else
{
    foreach (var result in Model.NewsList)
    {
        // display search results
    }
}

What is exacly going wrong here that cause this infinite loop? and how can I fix it?

In the stack trace I found these exceptions

[HttpException (0x80004005): Error executing child request for handler

'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'.]

this exception seems getting repeated

Answer

Ufuk Hacıoğulları picture Ufuk Hacıoğulları · May 20, 2013

Html.Action in master page calls the Search method with a POST request, so the framework won't call the action that returns the partial view but the other that returns a ViewResult with the master page. Same thing will happen again and you will be making recursive calls.

Simplest solution would be to rename the Search action that responds to POST request. Also make sure your form posts to this action but keep the same Html.Action call.

It seems like framework will still try to find the action that can respond to a POST request. Removing HttpGet attribute from Search action will solve this problem.