Асинхронный вызов приложения начинает возвращать ноль - PullRequest
0 голосов
/ 07 мая 2019

У меня есть вызов, который возвращает все категории в базе данных при переходе на главную страницу.Идея состоит в том, что на странице указателя динамически отображается список категорий.Категории были размещены с помощью EF .Net Core для создания кода, который вставляет категории в базу данных - вот как выглядит эта база данных.

https://gyazo.com/c407f03ae60a82c6fa6f9ee12105089d

РЕДАКТИРОВАТЬ: Получить категории:

[AllowAnonymous]
        public async Task<List<Category>> GetCategoriesFromDb()
        {
            return await _context.Categories.Where(x => x.ParentId == 0).ToListAsync();
        }

Выдает эту ошибку:

https://gyazo.com/7e27dda9ff57b6e28b58b563abd05767

ArgumentNullException: Value cannot be null.
Parameter name: source
System.Linq.Enumerable.Count<TSource>(IEnumerable<TSource> source)
AspNetCore.Views_Home__categories.ExecuteAsync() in _categories.cshtml
+
    @if (Model.Count() > 0)
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage 
page, ViewContext context)
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page, 
ViewContext context, bool invokeViewStarts)
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context) = 
AspNetCore.Views_Home_Index.ExecuteAsync() in Index.cshtml
+
<partial name="_categories" , for="Categories" />

Похоже, что при последующей навигации по странице (буквально обновить ее один раз) ошибка исчезает.

Вот контроллер, на котором он выходит из строя:

https://gyazo.com/ee6db603cde49a7b704b200e7e5fa2dc

// Model stores an IEnumerable of Products and Categories to be used with the two partial views.
            Index myModel = new Index();
            myModel.Categories = new List<Category>();
            myModel.Products = new List<Product>();

            myModel.Categories = await GetCategories();

Вот код и вид вопроса:

https://gyazo.com/634b6867601fc582836e284cdacb0ca3

@{
@model List<Category>
}


<div>

    @if (Model.Count() > 0)
    {
        <a class="btn btn-secondary" href="~/Home/Index/" style="margin-bottom:10px;">All</a>
        @foreach (var item in Model)
        {

            <a class="btn btn-secondary" href="~/Home/Index?Category=@item.Name&Zip=@ViewBag.Zip" style="margin-bottom:10px;">@item.Name</a>
        }


    }
    else
    {
        <a class="btn btn-secondary" href="~/Home/Index/" style="margin-bottom:10px;">All</a>
    }
</div>

Вот модель представления:

https://gyazo.com/e5053f6827d2198742279eb37071c733

namespace Market.Views.Home
{
public class Index
{

    public List<Product> Products { get; set; }
    public List<Category> Categories { get; set; }

}

Если я снова перейду на страницу, ошибка исчезнет.Я боюсь, что это ответственно за 0,4% случаев, когда мое приложение возвращает ошибку 500.

Я пытался изменить его с IEnumerable на List - но на самом деле я не знаю, как устранить неполадкиэта проблема.Похоже, мне нужно обрабатывать, когда список категорий равен нулю, но я бы предпочел, чтобы представление вообще не падало, и подождал, пока все категории будут найдены.

Я могу сказать, что это потому, что списокof category is null, когда представление Razor попадает в оператор if, проверяя, есть ли категории.Я должен просто повторить попытку, пока не появятся категории, я думаю, но я не уверен.

РЕДАКТИРОВАТЬ: При дальнейшей проверке ошибка происходит на моем сервере базы данных SQL в соответствии с Azure.Это происходит с этим исключением, которое, похоже, связано с проблемой, с которой я сталкиваюсь на местах.

System.NullReferenceException: Object reference not set to an instance of an object.
   at Market.Controllers.HomeController.GetGeoProducts(Nullable`1 Distance, String productSearch, String Zip, String Category) in C:\Users\nvn\source\repos\market\Market.Core\Market.Core\Controllers\HomeController.cs:line 162
   at Market.Controllers.HomeController.Index(String Category, Double Distance, String productSearch, String Zip, String sortOrder, String currentFilter, Nullable`1 pageNumber) in C:\Users\nvn\source\repos\market\Market.Core\Market.Core\Controllers\HomeController.cs:line 80
   at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at System.Threading.Tasks.ValueTask`1.get_Result()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

1 Ответ

0 голосов
/ 10 мая 2019

Спасибо за помощь, ребята - это стало критическим уроком в ведении журнала.

Я изменил код для получения категорий, чтобы просто создать предварительно заполненный список SelectList вместо его извлечения из БД.

@{
var Categories = new List<Category>(){
            //new Category
            //{
            //    CategoryId = 1,
            //    ParentId = 0,
            //    Name = "All",
            //    ParentCategory = null
            //},
            new Category
            {
                CategoryId = 2,
                ParentId = 0,
                Name = "Electronics",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 3,
                ParentId = 0,
                Name = "Furniture",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 4,
                ParentId = 0,
                Name = "Clothing",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 5,
                ParentId = 0,
                Name = "Shoes",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 6,
                ParentId = 0,
                Name = "Video Games",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 7,
                ParentId = 0,
                Name = "Books",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 8,
                ParentId = 0,
                Name = "Tools",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 9,
                ParentId = 0,
                Name = "Vehicles",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 10,
                ParentId = 0,
                Name = "Free",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 11,
                ParentId = 0,
                Name = "Jewelry",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 12,
                ParentId = 0,
                Name = "Crafts",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 13,
                ParentId = 0,
                Name = "Crafts",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 14,
                ParentId = 0,
                Name = "Appliances",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 15,
                ParentId = 0,
                Name = "Health",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 16,
                ParentId = 0,
                Name = "Tickets",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 17,
                ParentId = 0,
                Name = "Services",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 18,
                ParentId = 0,
                Name = "Home & Garden",
                ParentCategory = null
            },
            new Category
            {
                CategoryId = 19,
                ParentId = 0,
                Name = "Collectibles",
                ParentCategory = null
            }
};

Но ошибка все еще создавалась - поэтому я проверил журналы после добавления NLog:

    2019-05-06 12:09:56.6564|ERROR|Market.Controllers.HomeController|MaxMind.GeoIP2.Exceptions.AddressNotFoundException: The address ::1 is not in the database.
   at MaxMind.GeoIP2.DatabaseReader.Execute[T](String ipStr, IPAddress ipAddress, String type, Boolean throwOnNullResponse)
   at MaxMind.GeoIP2.DatabaseReader.City(IPAddress ipAddress)
   at Market.Controllers.HomeController.GetGeoProducts(Nullable`1 Distance, String productSearch, String Zip, String Category) in C:\Users\nvn\source\repos\market\Market.Core\Market.Core\Controllers\HomeController.cs:line 169
   at Market.Controllers.HomeController.Index(String Category, Nullable`1 Distance, String productSearch, String Zip, String sortOrder, String currentFilter, Nullable`1 pageNumber) in C:\Users\nvn\source\repos\market\Market.Core\Market.Core\Controllers\HomeController.cs:line 85
2019-05-06 12:12:07.8714|ERROR|Market.Controllers.HomeController|MaxMind.GeoIP2.Exceptions.AddressNotFoundException: The address ::1 is not in the database.
   at MaxMind.GeoIP2.DatabaseReader.Execute[T](String ipStr, IPAddress ipAddress, String type, Boolean throwOnNullResponse)
   at MaxMind.GeoIP2.DatabaseReader.City(IPAddress ipAddress)
   at Market.Controllers.HomeController.GetGeoProducts(Nullable`1 Distance, String productSearch, String Zip, String Category) in C:\Users\nvn\source\repos\market\Market.Core\Market.Core\Controllers\HomeController.cs:line 169
   at Market.Controllers.HomeController.Index(String Category, Nullable`1 Distance, String productSearch, String Zip, String sortOrder, String currentFilter, Nullable`1 pageNumber) in C:\Users\nvn\source\repos\market\Market.Core\Market.Core\Controllers\HomeController.cs:line 85
2019-05-06 12:21:50.0824|ERROR|Market.Controllers.HomeController|MaxMind.GeoIP2.Exceptions.AddressNotFoundException: The address ::1 is not in the database.
   at MaxMind.GeoIP2.DatabaseReader.Execute[T](String ipStr, IPAddress ipAddress, String type, Boolean throwOnNullResponse)
   at MaxMind.GeoIP2.DatabaseReader.City(IPAddress ipAddress)
   at Market.Controllers.HomeController.GetGeoProducts(Nullable`1 Distance, String productSearch, String Zip, String Category) in C:\Users\nvn\source\repos\market\Market.Core\Market.Core\Controllers\HomeController.cs:line 169
   at Market.Controllers.HomeController.Index(String Category, Nullable`1 Distance, String productSearch, String Zip, String sortOrder, String currentFilter, Nullable`1 pageNumber) in C:\Users\nvn\source\repos\market\Market.Core\Market.Core\Controllers\HomeController.cs:line 85

По какой-то причине фактическая ошибка - IP-адрес не найден в БД GeoIP - была скрыта в трассировке стека, которая была брошена в prod. Не совсем понятно почему, но либо использовались люди с диапазоном IP-адресов, которого у нас не было в бесплатной версии, либо возникла какая-то ошибка обратной связи, такая же, как при отладке в режиме dev.

Во всяком случае, вот как я справился с этим -

// Determine IP address of request.
                    var ipAddress = HttpContext.Connection.RemoteIpAddress;
                    try
                    {
                        // Grab the city if it's not null
                        var city = reader.City(ipAddress);
                        ViewBag.Zip = city.Postal.Code;
                        ViewBag.CurrentDistance = Distance;
                    }
                    catch(AddressNotFoundException e)
                    {

                        logger.Warn(e.ToString());
                        // Grab the city if it's not null
                        var city = reader.City("insert a random IP here");
                        ViewBag.Zip = city.Postal.Code;
                        ViewBag.CurrentDistance = Distance;
                    }

Спасибо за вашу помощь всем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...