Bad Gateway (502.3) из-за TagHelper'а

232
23 марта 2018, 10:19

Есть простой метод (экшен) в контроллере:

public IActionResult Test() => View();

Также простая View, которая отображает только тег-хелпер:

@{
    Layout = null;
}
<stars-block title-id="56" score="6" default="true"></stars-block>

А вот сам класс тег-хелпера:

public class StarsBlockTagHelper : TagHelper
{
    public int TitleId { get; set; }
    public int Score { get; set; }
    public bool Default { get; set; }
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "div";
        output.Attributes.Add("class", "block-stars");
        output.Attributes.Add("data-title_id", TitleId);
        output.Attributes.Add("data-score", Score);
        output.Attributes.Add("data-default", Default);
        TagBuilder ul = new TagBuilder("ul");
        ul.AddCssClass("w3l-ratings");
        TagBuilder li;
        for (int i = 1; i <= 10; i =+ 2)
        {
            li = new TagBuilder("li");
            li.InnerHtml.AppendHtml(getStarHalf("left", i));
            li.InnerHtml.AppendHtml(getStarHalf("right", i + 1));
            ul.InnerHtml.AppendHtml(li);
        }
        output.Content.AppendHtml(ul);
    }
    private TagBuilder getStarHalf(string direction, int id)
    {
        TagBuilder div = new TagBuilder("div");
        div.AddCssClass("star-half");
        div.Attributes.Add("data-star_half_id", id.ToString());
        TagBuilder svg = new TagBuilder("svg");
        svg.Attributes.Add("version", "1.1");
        svg.Attributes.Add("id", "Layer_1");
        svg.Attributes.Add("xmlns", "http://www.w3.org/2000/svg");
        svg.Attributes.Add("xmlns:xlink", "http://www.w3.org/1999/xlink");
        svg.Attributes.Add("x", "0px");
        svg.Attributes.Add("y", "0px");
        svg.Attributes.Add("viewBox", "0 0 8.7 16.7");
        svg.Attributes.Add("xml:space", "preserve");
        TagBuilder path = new TagBuilder("path");
        path.TagRenderMode = TagRenderMode.SelfClosing;
        path.AddCssClass("star-half-" + direction);
        path.Attributes.Add("d", "M8.9,1.7L6,6.1L0.5,6.9l3.9,3.8l-0.9,5.5c1.8-1,3.6-1.9,5.4-2.9");
        svg.InnerHtml.AppendHtml(path);
        div.InnerHtml.AppendHtml(svg);
        return div;
    }

Ну и что в теории он должен вернуть:

<div class="block-stars" data-title_id="56" data-score="6" default="true">
    <ul class="w3l-ratings" >
        <li>
            <div class="star-half" data-star_half_id="1">
                <svg
                 version="1.1" 
                 id="Layer_1" 
                 xmlns="http://www.w3.org/2000/svg" 
                 xmlns:xlink="http://www.w3.org/1999/xlink" 
                 x="0px"
                 y="0px"
                 viewBox="0 0 8.7 16.7"
                 xml:space="preserve">
                    <path class="star-half-left" 
                          d="M8.9,1.7L6,6.1L0.5,6.9l3.9,3.8l-0.9,5.5c1.8-1,3.6-1.9,5.4-2.9"/>
                </svg>
            </div>
            <div class="star-half" data-star_half_id="2">
                <svg 
                version="1.1" 
                id="Layer_1" 
                xmlns="http://www.w3.org/2000/svg" 
                xmlns:xlink="http://www.w3.org/1999/xlink" 
                x="0px" 
                y="0px"
                viewBox="0 0 8.7 16.7"  
                    xml:space="preserve">
                    <path class="star-half-right"
                          d="M8.9,1.7L6,6.1L0.5,6.9l3.9,3.8l-0.9,5.5c1.8-1,3.6-1.9,5.4-2.9"/>
                </svg>
            </div>
        </li>
        <!-- and so on 10 times -->
    </ul>
</div>

Но при обращении по адресу экшена идёт очень долгая загрузка и ничего не возвращается.

Ещё чуть ранее, до того как я исправил некоторые моменты (которые по идее не должны были иметь отношения к проблеме (?)), он вовсе за несколько секунд съедал всю ОЗУ и лез в swap, что приводило к зависанию рабочей машины. А именно, на тот момент li объявлялся внутри цикла, результаты getStarHalf() я отдавал ul и забыл добавить output.Content.AppendHtml(ul);.

После исправления этих моментов память перестала потребляться в огромных масштабах, но всё равно потреблялась понемногу (выросла с 300мб до 500мб прежде чем выдать ошибку).

Ошибка: HTTP Error 502.3 - Bad Gateway

Answer 1

за несколько секунд съедал всю ОЗУ

Цикл никогда не заканчивается, а крутится с i равным двум, создавая новые объекты.

for (int i = 1; i <= 10; i = i + 2)

или

for (int i = 1; i <= 10; i += 2)
READ ALSO
Как превратить координаты Min0, Min1, Max0, Max1 в Rectangle?

Как превратить координаты Min0, Min1, Max0, Max1 в Rectangle?

Есть координаты прямоугольника на экране: Min0, Min1, Max0, Max1Их нужно превратить в

201
C# Отправка xml через POST

C# Отправка xml через POST

Добрый день! Пытаюсь отправить методом POST xml-файл (в УТМ ЕГАИС)В ответ сервер выдает ошибку Error 500 Server Error HTTP ERROR 500 Problem accessing /opt/in/QueryRests_v2

250
Что конкретно делает метод Thread.SpinWait?

Что конкретно делает метод Thread.SpinWait?

Из документации откровенно говоря ничего непонятно, все очень сумбурноЧто именно делает этот метод?

216
Как выдрать видеострим на флеше с сайта?

Как выдрать видеострим на флеше с сайта?

Приветствую всех! Есть Сайт, и есть необходимость качать видеострим к себе, затем транслировать его же, но уже без флеша, в перспективеВсе...

225