#c# #html-agility-pack #nullreferenceexception #blazor-server-side
#c# #html-agility-pack #исключение nullreferenceexception #blazor-на стороне сервера
Вопрос:
Я использую Html Agility Pack для получения мета-тегов из URL-адресов. Я использовал HtmlWeb
‘s Load
, но обнаружил, что это занимает слишком много времени, и подумал, что, вероятно, я мог бы ускорить производительность, используя вместо этого асинхронный метод. Однако, когда я попытался использовать LoadFromWebAsync
, я получаю исключение NullReferenceException.
Использование Load
public static MetaTags GetMetaData(string url)
{
// This works
var webGet = new HtmlWeb();
var document = webGet.Load(url);
var metaTags = document.DocumentNode.SelectNodes("//meta");
MetaTags metaInfo = new MetaTags(url);
//more code
}
Использование LoadFromWebAsync
public static async Task<MetaTags> GetMetaData(string url)
{
// This doesn't work
var webGet = new HtmlWeb();
var document = await webGet.LoadFromWebAsync(url); //breaks here
var metaTags = document.DocumentNode.SelectNodes("//meta");
MetaTags metaInfo = new MetaTags(url);
//more code
}
Я использую этот метод, чтобы передать данные URL NewsCard
-адреса компоненту, который я пытаюсь выполнить, например:
<p
@news.Title
</p>
@code {
public MetaTags news { get; set; }
protected override async Task OnInitializedAsync()
{
news = await MetaScraper.GetMetaData(" https://www.denverpost.com/2020/10/03/president-trump-fight-against-covid-19-update/");
}
}
Почему я получаю эту ошибку и что я могу сделать, чтобы ее исправить?
Редактировать: я не уверен, что такое null, я работаю в Blazor, и когда он прерывается, он завершается в _Host.cshtml в этой строке, которая существовала с момента создания проекта : . Я думаю, это может иметь какое-то отношение к тому, что я пытаюсь загрузить компонент до того, как ему будет что заполнить.
Трассировка стека:
ThinBlueLieB.Components.NewsCard.<BuildRenderTree>b__0_0(RenderTreeBuilder __builder2)
Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.AddContent(int sequence, RenderFragment fragment)
Syncfusion.Blazor.Cards.SfCard.BuildRenderTree(RenderTreeBuilder __builder)
Microsoft.AspNetCore.Components.ComponentBase.<.ctor>b__6_0(RenderTreeBuilder builder)
Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment renderFragment)
Microsoft.AspNetCore.Components.RenderTree.Renderer.RenderInExistingBatch(RenderQueueEntry renderQueueEntry)
Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue()
Microsoft.AspNetCore.Components.Rendering.HtmlRenderer.HandleException(Exception exception)
Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue()
Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessPendingRender()
Microsoft.AspNetCore.Components.RenderTree.Renderer.AddToRenderQueue(int componentId, RenderFragment renderFragment)
Microsoft.AspNetCore.Components.ComponentBase.StateHasChanged()
Microsoft.AspNetCore.Components.ComponentBase.CallOnParametersSetAsync()
Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync()
Microsoft.AspNetCore.Components.Rendering.HtmlRenderer.HandleException(Exception exception)
Microsoft.AspNetCore.Components.RenderTree.Renderer.AddToPendingTasks(Task task)
Microsoft.AspNetCore.Components.Rendering.ComponentState.SetDirectParameters(ParameterView parameters)
Microsoft.AspNetCore.Components.RenderTree.Renderer.RenderRootComponentAsync(int componentId, ParameterView initialParameters)
Microsoft.AspNetCore.Components.Rendering.HtmlRenderer.CreateInitialRenderAsync(Type componentType, ParameterView initialParameters)
Microsoft.AspNetCore.Components.Rendering.HtmlRenderer.RenderComponentAsync(Type componentType, ParameterView initialParameters)
Microsoft.AspNetCore.Components.Rendering.RendererSynchronizationContext <>c__11<TResult> <<InvokeAsync>b__11_0>d.MoveNext()
Microsoft.AspNetCore.Mvc.ViewFeatures.StaticComponentRenderer.PrerenderComponentAsync(ParameterView parameters, HttpContext httpContext, Type componentType)
Microsoft.AspNetCore.Mvc.ViewFeatures.ComponentRenderer.PrerenderedServerComponentAsync(HttpContext context, ServerComponentInvocationSequence invocationId, Type type, ParameterView parametersCollection)
Microsoft.AspNetCore.Mvc.ViewFeatures.ComponentRenderer.RenderComponentAsync(ViewContext viewContext, Type componentType, RenderMode renderMode, object parameters)
Microsoft.AspNetCore.Mvc.TagHelpers.ComponentTagHelper.ProcessAsync(TagHelperContext context, TagHelperOutput output)
Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperRunner.<RunAsync>g__Awaited|0_0(Task task, TagHelperExecutionContext executionContext, int i, int count)
ThinBlueLieB.Pages.Pages__Host.<ExecuteAsync>b__17_1() in _Host.cshtml
<component type="typeof(App)" render-mode="ServerPrerendered" />
Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperExecutionContext.SetOutputContentAsync()
ThinBlueLieB.Pages.Pages__Host.ExecuteAsync() in _Host.cshtml
Layout = null;
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)
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext, string contentType, Nullable<int> statusCode)
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext, string contentType, Nullable<int> statusCode)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|29_0<TFilter, TFilterAsync>(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext<TFilter, TFilterAsync>(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
Microsoft.VisualStudio.Web.BrowserLink.BrowserLinkMiddleware.ExecuteWithFilter(IHttpSocketAdapter injectScriptSocket, string requestId, HttpContext httpContext)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
Комментарии:
1. Что именно ломается? В этом случае, что такое null?
2. Я попробовал метод async, и он отлично работает до этой строки: var metaTags = document . DocumentNode. SelectNodes(«// meta»); // Он содержит HtmlNodeCollection, который вы можете обработать дальше
3. Я не уверен, что такое null, я работаю в Blazor, и когда он прерывается, он завершается в _Host.cshtml в этой строке:
<component type="typeof(App)" render-mode="ServerPrerendered" />
4.
ServerPrerendered
предназначен для сервера Blazor, что означает, что вы можете отлаживать свое приложение и использовать точки останова. Вы также можете использовать обработку исключений и ведение журнала, чтобы увидеть, где было вызвано исключение. Полный текст исключения содержит местоположение, в котором было вызвано исключение, и трассировку стека, показывающую вызовы, которые привели к нему5. @PanagiotisKanavos Я обновил свой вопрос, включив трассировку стека, но я не понимаю его достаточно хорошо, чтобы он указывал на строку кода, которая вызывает проблему. Я не могу достичь никаких точек останова после
await ...
строки
Ответ №1:
Проблема заключалась в том, что я пытался отобразить данные до их загрузки. Это произошло потому, что я использовал async, но не предоставлял что-то для отображения, пока он ожидал результата. Это можно исправить, выполнив:
if (news.HasData == false) {
<p>Loading</p>
}
else{
<p>
@news.Title
</p>
}
@code {
public MetaTags news { get; set; }
protected override async Task OnInitializedAsync()
{
news = new MetaTags(newsUrl); //initialized with HasData = false
news = await MetaScraper.GetMetaData(newsUrl); //Filling out with data later.
}
}
Комментарии:
1. Пожалуйста, примите ваш ответ, чтобы проблема могла отображаться как ответ
2. Я не могу, вам нужно подождать 24 часа, прежде чем принять ответ, который вы опубликовали на свой собственный вопрос