Прокси-сервер для веб-клиента 1С: Предприятие 8.2

20.08.12

База данных - Инструменты администратора БД

Прокси-сервер для веб-клиента 1С:Предприятие 8.2 демонстрирует возможности подключения, управления содержимым, мониторинга и отладки html- и javascript-кодов, возвращаемых сервером 1С. Работу прокси-сервера можно наглядно посмотреть в Интернете по адресу: http://proxy.1csoftware.com

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Исходный код проекта Asp.Net MVC 3
.zip 506,92Kb
22
22 Скачать (1 SM) Купить за 1 850 руб.

Прокси-сервер для веб-клиента 1С: Предприятие 8.2 демонстрирует возможности подключения, управления содержимым, мониторинга и отладки html- и javascript-кодов, возвращаемых сервером 1С. Работу прокси-сервера можно наглядно посмотреть в Интернете по адресу: http://proxy.1csoftware.com

Введение


Одной из главных функциональных особенностей 1С: Предприятие 8.2 стала возможность получения доступа к данным 1С через Интернет. Но компания 1С делает это в своей традиционной манере, скрывая детали генерации веб-содержимого для браузеров и не обращая внимания на некоторые общепринятые стандарты. Программисту нужно относиться к процессу выдачи веб-содержимого, как к черному ящику, в котором по неизвестным законам происходит преобразование метаданных и данных в html-, json- и jscript-ответы от сервера. Прокси-сервер поможет вмешаться в процесс отображения данных и глубже разобраться с генерацией контента. Он будет находится между браузером и сервером 1С: Предприятие, перехватывать и перенаправлять запросы.





Статья ссылается на технологии: Asp.Net MVC 3, .Net framework 4, IIS 7/7.5. Настоятельно рекомендуется запускать решение под IIS, а не в Visual Studio Development Server.
В качестве средства разработки была выбрана технология Asp.Net MVC 3 не случайно. Гибкость и наглядность предоставляемых средств позволяет быстро выполнить разработку и сэкономить на поддержке в будущем. Эту же задачу можно было бы решить на более низком уровне, например, через многопоточные HttpListener, но такое решение сопровождалось бы упомянутыми издержками. Правда, не исключено, что встретившись с нерешаемыми трудностями в будущем, придется переписать прокси-сервер на более низкоуровневых объектах. В случае с 1С: Предприятие такие трудности гарантированно есть всегда, и далеко не факт, что они были все выявлены и устранены. Речь о них пойдет ниже.

Пример опубликован в Интернете, и его можно посмотреть здесь: http://proxy.1csoftware.com

Проект Asp.Net MVC 3


Любой проект Asp.Net MVC начинается с проектирования структуры URL в методе RegisterRoutes, вызываемом в Application_Start из Gloval.asax. Для 1С:Предприятия URL строится так:
 

<домен>/<приложение>/<язык>/<путь-к-ресурсу>?<параметры-через-&>


Среди параметров одним из самых частых является sysver. Язык присутствует везде, кроме общего запроса к приложению. Соответственно этой структуре будет код, регистрирующий правила ProxyLanguage и Proxy:

routes.MapRoute(
    "ProxyLanguage",                                         // Route name
    "{application}/{lang}/{*pathInfo}",                      // URL with parameters
    new { lang = System.Globalization.CultureInfo.CurrentUICulture.Name, controller = "Proxy", action = "Transfer", pathInfo = UrlParameter.Optional },
    new { lang = @"\w{2}_\w{2}|\w{2}" }
);

routes.MapRoute(
    "Proxy",                                          // Route name
    "{application}/{*pathInfo}",                      // URL with parameters
    new { controller = "Proxy", action = "Transfer", pathInfo = UrlParameter.Optional }
);

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);


Последняя команда была изначально в проекте и позволит открыть главную страницу с описанием примера, обратившись по адресу без пути. Для этого выделен отдельный контроллер Home, действие Index и вид Index с html-разметкой.
Исходя из кода, запросы для 1С будут перенаправлены на контроллер Proxy с действием Transfer. Контроллер лучше взять сразу асинхронный, наследовав от AsyncController, чтобы увеличить производительность. В этом случае действие Transfer будет состоять из двух методов:

public void TransferAsync(string pathInfo, string sysver)
public ActionResult TransferCompleted(HttpWebResponse response)


Так как приложение Application и язык Language предопределены, их целесообразно вынести в строковые свойства для доступа из любой части класса:       

public string Language { get; set; }
public string Application { get; set; }


И инициализировать в перегруженном методе Initialize так:       

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
        {
            base.Initialize(requestContext);

            if (requestContext.RouteData.Values.ContainsKey("lang"))
                Language = requestContext.RouteData.Values["lang"].ToString();

            if (requestContext.RouteData.Values.ContainsKey("application"))
                Application = requestContext.RouteData.Values["application"].ToString();
            else
                RedirectToAction("Index", "Home");
        }


Метод TransferAsync принимает запрос от клиента, инициализирует объект HttpWebRequest, передавая в него информацию из свойства Request контроллера о методе (GET или POST), заголовках браузера, куки, содержимом POST-запроса. Метод приведен полностью:

public void TransferAsync(string pathInfo, string sysver)
{
    AsyncManager.OutstandingOperations.Increment();

    ViewBag.SysVer = sysver;
    ViewBag.PathInfo = pathInfo;

    HttpWebRequest remoteRequest = (HttpWebRequest)HttpWebRequest.Create(new Uri("http://demo-ma.1c.ru/" + Application + (string.IsNullOrEmpty(Language)? "" : "/" + Language) + "/" + pathInfo + Request.Url.Query));
    remoteRequest.Method = Request.HttpMethod;
    remoteRequest.CookieContainer = new CookieContainer();
    if (Request.UrlReferrer != null)
        remoteRequest.Referer = Request.UrlReferrer.ToString();
    remoteRequest.UserAgent = Request.UserAgent;

    for (int i = 0; i < Request.Cookies.Count; i++)
    {
        HttpCookie cookie = Request.Cookies.Get(i);

        Cookie newCookie = new Cookie();

        newCookie.Domain = remoteRequest.RequestUri.Host;

        newCookie.Expires  = cookie.Expires;
        newCookie.Name     = cookie.Name;
        newCookie.Path     = cookie.Path;
        newCookie.Secure   = cookie.Secure;
        newCookie.Value    = cookie.Value;

        remoteRequest.CookieContainer.Add(newCookie);
    }

    foreach(string key in Request.Headers)
    {
        if (key == "Connection")
        {
            try
            {
                remoteRequest.Connection = Request.Headers.Get(key);
            }
            catch (Exception)
            { }
            continue;
        }
        if (key == "Accept")
        {
            remoteRequest.Accept = Request.Headers.Get(key);
            continue;
        }
        if (key == "Host")
            continue;
        if (key == "User-Agent")
            continue;
        if (key == "Referer")
            continue;
        if (key == "Content-Length")
            continue;
        if (key == "Content-Type")
        {
            remoteRequest.ContentType = Request.Headers.Get(key);
            continue;
        }
        remoteRequest.Headers.Add(key, Request.Headers.Get(key));
    }

    if (remoteRequest.Method == "POST")
    {
        using (var inputStream = remoteRequest.GetRequestStream())
        {
            MemoryStream memoryStream = new MemoryStream();

            byte[] buffer = new byte[255];
            int bytesRead;
            double totalBytesRead = 0;
            Request.InputStream.Position = 0;
            while ((bytesRead = Request.InputStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                totalBytesRead += bytesRead;
                memoryStream.Write(buffer, 0, bytesRead);
            }

            inputStream.Write(memoryStream.ToArray(), 0, (int)memoryStream.Length);
            memoryStream.Close();
        }
    }

    remoteRequest.BeginGetResponse(result =>
        {
            try
            {
                WebResponse response = remoteRequest.EndGetResponse(result);
                AsyncManager.Parameters["response"] = (HttpWebResponse)response;
            }
            catch (WebException e)
            {
                AsyncManager.Parameters["response"] = (HttpWebResponse)e.Response;
            }
            AsyncManager.OutstandingOperations.Decrement();
        },
        null
    );
}


Код метода TransformCompleted небольшой по размерам и представлен далее. В этом методе целесообразно отдельно получить поток ответа GetResponseStream() и сохранить его содержимое в переменную ViewBag.ResponseContent для повторного использования, так как несколько раз к этому потоку обратиться не получится.
Ответ от сервера может быть любой, необходимо определить свой ActionResult-наследованный класс ContentActionResult, и возвратить его. Он может содержать рисунки, html, json, jscript, текст и другие форматы.       

public ActionResult TransferCompleted(HttpWebResponse response)
        {
            using (var responseStream = response.GetResponseStream())
            {
                MemoryStream memoryStream = new MemoryStream();

                byte[] buffer = new byte[255];
                int bytesRead;
                double totalBytesRead = 0;
                while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    totalBytesRead += bytesRead;
                    memoryStream.Write(buffer, 0, bytesRead);
                }
                ViewBag.ResponseContent = memoryStream.ToArray();
            }

            return new ContentActionResult() { RemoteResponse = response, FilePath = filePath, ResponseContent = ViewBag.ResponseContent };
        }



Класс ContentActionResult преобразует ответ от оригинального сервера 1С и возвратит клиенту куки, заголовки и тело ответа, а также код статуса.

public class ContentActionResult : ActionResult
{
    public HttpWebResponse RemoteResponse { get; set; }
    public string FilePath { get; set; }
    public byte[] ResponseContent { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        response.ContentType = RemoteResponse.ContentType;
        response.Charset = RemoteResponse.CharacterSet;
        response.StatusCode = (int)RemoteResponse.StatusCode;

        for (int i = 0; i < RemoteResponse.Cookies.Count; i++)
        {
            Cookie cookie = RemoteResponse.Cookies[i];

            HttpCookie newCookie = new HttpCookie(cookie.Name);

            newCookie.Domain = context.HttpContext.Request.Url.Host;

            if (string.IsNullOrEmpty(newCookie.Domain))
                newCookie.Domain = context.HttpContext.Request.Url.Host;

            newCookie.Expires = cookie.Expires;
            newCookie.Name = cookie.Name;
            newCookie.Path = cookie.Path;
            newCookie.Secure = cookie.Secure;
            newCookie.Value = cookie.Value;

            response.SetCookie(newCookie);
        }

        
        foreach (string key in RemoteResponse.Headers.AllKeys)
        {
            response.AddHeader(key, RemoteResponse.Headers.Get(key));
        }
        response.BinaryWrite(ResponseContent);
    }
}

Проблемы реализации



При разработке прокси-сервера было насколько проблем. Все они были связаны с невнимательностью компании 1С к стандартам веб-разработки. Если рассматривать пример статьи как unit-тест, то разработчикам компании 1С следует обратить внимание и зарегистрировать 2 проблемы:

Двоеточие в пути к ресурсу


Сервер от 1С допускает двоеточие в пути к ресурсу. Ответ от него может быть примерно следующим:
http://demo-ma.1c.ru/demoen/en_US/e1cib/pictureCollection/picture/0:dfa91944-c44c-403e-93b5-93d998359611?confver=01bdd81e-8d68-421d-a0e3-a381ab938613&t=false&w=48&h=48

Двоеточие является зарезервированным символом, и по стандарту rfc 3986 не допускается его использование в пути. Эта сложность приводит к невозможности принять запрос через Visual Studio Development Server и необходимости использовать IIS. Для IIS требуется дополнительная настройка в web.config:

<httpRuntime requestValidationMode="2.0" requestPathInvalidCharacters=",*,&,\,?" /> 


Настройка позволяет исключить двоеточие из недействительных символов пути.
Кто знает, может странное поведение тонкого клиента на IIS 7.x версии, отмеченное в сообществе 1С-разработчиков связано тоже с данной проблемой.

Неверный формат JSON



Некоторые ответы от 1С-сервера возвращают JSON-содержимое в виде:
{"root":{"cacheID":undefined, ...
Проблема возникает со значением undefined, которое по общепринятым стандартам должно быть заключено в кавычки. Значение может быть только строкой в двойных кавычках, числом, булевым значением: true или false, массивом в квадратных скобках или значением null.
Такое несоответствие приводит к ошибке: «Invalid JSON primitive: undefined», когда Asp.Net MVC пытается автоматически привести JSON к параметрам действия Transfer. Решается проблема исключением формата JSON из списка фабрик преобразований значений в Global.asax.   

void Application_Start(object sender, EventArgs e)
    {
        //Workaround error Invalid JSON primitive: undefined. when Post data contains {"root":{"cacheID":undefined, ...
        ValueProviderFactories.Factories.Remove(
                    ValueProviderFactories.Factories.OfType().First());



Это некрасивый шаг, лишающий решение некоторой гибкости и расширяемости, но более изящного подобрать не удалось.

Управление веб-страницами




Прокси-сервер позволяет не только исследовать возвращаемые файлы сервером 1С, но и вмешаться в их генерацию. На рисунке видно простой пример, когда при инициализации показывается баннер в правом верхнем углу. Достигается это в методе TransferCompleted через отдельную сборку AgilityPack так:           

//Add new content
            if (ViewBag.PathInfo != null)
            {
                if (ViewBag.PathInfo == "mainform.html")
                {
                    HtmlDocument html = new HtmlDocument();
                    html.OptionFixNestedTags = true;
                    html.LoadHtml(Encoding.UTF8.GetString(ViewBag.ResponseContent, 0, ViewBag.ResponseContent.Length));

                    var res = html.DocumentNode.SelectSingleNode("//div[@id='preloader']");
                    HtmlNode node = html.CreateElement("img");
                    node.Attributes.Add("id", "1csoftware-powered");
                    node.Attributes.Add("style", "position:absolute;top:10px;right:10px;");
                    node.Attributes.Add("src", VirtualPathUtility.ToAbsolute("~/i/1csoftware.png"));
                    res.ChildNodes.Add(node);

                    ViewBag.ResponseContent = Encoding.UTF8.GetBytes(html.DocumentNode.OuterHtml);
                }
            }


За создание страницы загрузки отвечает файл mainform.html. Если в его div-раздел с именем preloader вставить какое-то содержимое, то содержимое появится в браузере при загрузке.
В более сложном варианте можно, например, исследовать работу форм и вмешаться в их логику, добавив свои элементы управления или обработчики, подключить jQuery. Можно поменять таблицу стилей и придать элементам свои цвета. Можно даже исправить самим ошибки Компании 1С, зная ее «оперативность» по борьбе с багами.

 

Заключение



Представленный в статье прокси-сервер находится между веб-браузером и сервером 1С: Предприятие 8.2. Перехватывает все запросы от браузера и передает их серверу. Таким образом, позволяет изучать передаваемые файлы и влиять на передаваемую информацию.
В качестве платформ разработки взяты .Net framework 4 и Asp.Net MVC 3. Решение построено через асинхронный контроллер для увеличения производительности. Кроме перенаправления запросов в прокси-сервер заложена логика обходных путей для 2х проблем: двоеточие в пути к ресурсу и некорректный формат JSON.
Решение обладает достаточной гибкостью и позволяет вмешаться в генерацию исходного кода html-, js- и других файлов.
В решении мало внимания уделялось логике работы 1С и взаимосвязи возвращаемых ответов от 1С-сервера. Это тема отдельной обширной статьи. Нереализованной и неисследованной осталась возможность работы по защищенному протоколу https. Работа тонкого клиента, соединенного через прокси-сервер также не исследовалась, хотя теоретически возможна.
Используя статью, можно написать прокси-сервер не только для узкой области 1С: Предприятие, но и для других своих решений. Случай с 1С: Предприятие более сложный, и кроме обычной трансформации запросов и откликов необходимо искать некоторые обходные пути, чтобы решение заработало.
Пример доступен в Интернете по адресу: http://proxy.1csoftware.com

См. также

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 руб.

20.08.2024    4616    32    16    

43

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 18.09.2024, версия 1.2

15600 руб.

06.12.2023    7882    36    5    

67

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 руб.

10.11.2023    9506    35    10    

58

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтер Пользователь Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    31937    103    151    

72

SALE! %

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

4800 3840 руб.

14.01.2013    185945    1129    0    

900

Архивирование (backup) Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Данная разработка позволит решить вопрос с резервным копированием Ваших баз в автоматическом режиме, расположенных на сервере 1С. Система умеет ставить блокировки на вход, блокировать фоновые задания, принудительно отключать сеансы пользователей. И все это система делает в автоматически при создании бэкапа (или через команду). Выгрузка происходит в родной формат 1С - .dt. Так же система умеет архивировать данные выгрузки с установкой пароля. Умеет менять расширение файла zip или dt на любое указанное вами, что позволит сохранить выгрузки от шифровальщика. Может удалять старые копии выгрузок, оставляя указанное количество резервных копий, начиная с самой поздней. Только для WINDOWS!

6000 руб.

06.11.2012    72287    625    45    

84

Инструменты администратора БД Системный администратор Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием Платные (руб)

Конфигурация Комплексная автоматизация 1.1 (и УПП 1.3 тоже) хранит файлы и изображения в справочнике Хранилище дополнительной информации в реквизите Хранилище типа ХранилищеЗначений. Та же история с ВложениямиЭлектроннойПочты. Но при этом присоединенные файлы в Электронном документообороте хранит в томах на диске. Эта доработка позволяет использовать стандартный механизм хранения файлов, изображений и вложений электронных писем в томах на диске. При этом можно разделить тома хранения по объектам конфигурации.

4200 руб.

10.11.2015    62556    92    59    

77

Инструменты администратора БД Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Многие сталкиваются с проблемой когда изображения, находящиеся в базе разные по объему и размерам. Менеджеры могут добавить файлы в очень высоком разрешении, объемом свыше 20 Мегабайт. База данных становится слишком большой, выгрузка на сайт идёт медленно и требуется много место на хостинге. Как сжать картинки и уменьшить размер базы 1С? Это можно сделать с помощью данной обработки. Существует возможность выбрать различные варианты для того чтобы уменьшить картинки: в разы, в процентах от первоначального объема, а также сделать картинки одинаковой ширины. В результате размер базы 1С значительно сократится (в зависимости от количества и размера картинок), а изображения станут небольшого объема, равными по ширине, почти без потери качества. Работает на управляемых формах для УТ 11, КА, ERP.

3000 руб.

21.07.2022    9623    7    4    

15
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Dimasik2007 430 20.08.12 21:00 Сейчас в теме
На почту вам откатал, продублирую и тут (сначала на хабре статью увидел). Пример не работает под хромом:
Server Error in '/' Application.

Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:


Line 173: node.Attributes.Add("style", "position:absolute;top:10px;right:10px;");
Line 174: node.Attributes.Add("src", VirtualPathUtility.ToAbsolute("~/i/1csoftware.png"));
Line 175: res.ChildNodes.Add(node);
Line 176:
Line 177: ViewBag.ResponseContent = Encoding.UTF8.GetBytes(html.DocumentNode.OuterHtml);
3. Elisy 951 21.08.12 07:17 Сейчас в теме
(1) Dimasik2007,

Из сообщения не понятно, ошибка у вас возникает при запуске по ссылке http://proxy.1csoftware.com или через запуск исходных кодов?
2. Magister 134 21.08.12 00:11 Сейчас в теме
4. Dimasik2007 430 21.08.12 10:55 Сейчас в теме
Вылет на вашем сайте, по ссылке http://proxy.1csoftware.com/demo_ma/ru_RU/
причем демо от 1с открывается нормально.
6. Elisy 951 21.08.12 11:14 Сейчас в теме
(4) Dimasik2007,
На хабре тоже жалуются на ошибки при открытии. Не могу пока предположить, в чем проблема.
Вот скриншоты для ФФ и ИЕ нормального открытия с моего компьютера:
fotki.yandex.ru/users/ebishkek/album/185477/?p=0
5. Dimasik2007 430 21.08.12 10:56 Сейчас в теме
И кстати, с яндекса вам письмо на суппорт не оптравляется, пишет типа ошибка релея и т.п.
7. Elisy 951 21.08.12 11:22 Сейчас в теме
(5) Dimasik2007,
К сожалению E-mail опубликован был устаревший. Рабочий адрес:
support(а)1csoftware.com
8. Stamper 43 22.08.12 11:09 Сейчас в теме
9. 1977 2 22.08.12 12:09 Сейчас в теме
Принажатии сылки http://proxy.1csoftware.com/trade/ru_RU/
Выкидывает ошибки в хроме?
Server Error in '/' Application.
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

Line 173: node.Attributes.Add("style", "position:absolute;top:10px;right:10px;");
Line 174: node.Attributes.Add("src", VirtualPathUtility.ToAbsolute("~/i/1csoftware.png"));
Line 175: res.ChildNodes.Add(node);
Line 176:
Line 177: ViewBag.ResponseContent = Encoding.UTF8.GetBytes(html.DocumentNode.OuterHtml);


Source File: c:\inetpub\vhosts\1csoftware.com\httpdocs\proxy\App_Code\ProxyController.cs Line: 175
10. Elisy 951 22.08.12 12:44 Сейчас в теме
(9) 1977,
к сожалению не могу воспроизвести проблему. Специально установил Хром, открывается страница без ошибок:
11. Dimasik2007 430 22.08.12 12:54 Сейчас в теме
(10 Если что - версия 22.0.1229.12 dev-m, на стабильных 22 тож не работает.
13. Elisy 951 22.08.12 13:04 Сейчас в теме
(11)(12)
На других браузерах ФФ или ИЕ такая же проблема?
12. 1977 2 22.08.12 12:55 Сейчас в теме
Мне не приснилось
Прикрепленные файлы:
14. 1977 2 22.08.12 13:17 Сейчас в теме
15. Elisy 951 22.08.12 13:31 Сейчас в теме
(14)
Получается дело не в конкретном браузере, а, может, в настройке сети.
Код, в котором происходит ошибка пытается в файле mainform.html найти div с id="preloaded".
Вы можете вручную загрузить файл http://proxy.1csoftware.com/trade/ru_RU/mainform.html
и в исходном коде посмотреть есть ли элемент <div id="preloader" ?
Может быть софт какой-нибудь Интернет-объявления обрезает и загрузочный рисунок 1С обрезал?

Вот исходный код:
//Add new content
            if (ViewBag.PathInfo != null)
            {
                if (ViewBag.PathInfo == "mainform.html")
                {
                    HtmlDocument html = new HtmlDocument();
                    html.OptionFixNestedTags = true;
                    html.LoadHtml(Encoding.UTF8.GetString(ViewBag.ResponseContent, 0, ViewBag.ResponseContent.Length));

                    var res = html.DocumentNode.SelectSingleNode("//div[@id='preloader']");
                    HtmlNode node = html.CreateElement("img");
                    node.Attributes.Add("id", "1csoftware-powered");
                    node.Attributes.Add("style", "position:absolute;top:10px;right:10px;");
                    node.Attributes.Add("src", VirtualPathUtility.ToAbsolute("~/i/1csoftware.png"));
                    res.ChildNodes.Add(node);

                    ViewBag.ResponseContent = Encoding.UTF8.GetBytes(html.DocumentNode.OuterHtml);
                }
            }
Показать
16. aprol 10.10.12 16:42 Сейчас в теме
добавил в вебКонфиг
<system.web>
<httpRuntime requestPathInvalidCharacters="<,>,*,&,\,?" />
</system.web>
Но ошибка осталась. Не подскажете с чем еще может быть связана ошибка:

ошибка при работе с ресурсом /e1cib/logForm?cmd=call

?
18. Elisy 951 11.10.12 11:30 Сейчас в теме
(16) aprol,
Добавлять нужно в раздел <system.web>
Привожу образец web.config для рабочего сайта
<?xml version="1.0"?>
<configuration>
  <configSections>
  </configSections>
  <appSettings>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
  </appSettings>
  <system.web>

    <globalization uiCulture="ru-RU" culture="ru-RU" />

    <!-- 
            Set compilation debug="true" to insert debugging 
            symbols into the compiled page. Because this 
            affects performance, set this value to true only 
            during development.
    -->
    <compilation debug="true">
      <assemblies>
        <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
      </assemblies>
    </compilation>
    <!--
            The <authentication> section enables configuration 
            of the security authentication mode used by 
            ASP.NET to identify an incoming user. 
    -->
    <authentication mode="Forms">
      <forms loginUrl="~/account/logon" timeout="2880"/>
    </authentication>
    <!--<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
      -->
    <!--<error statusCode="403" redirect="NoAccess.htm" />
      <error statusCode="404" redirect="FileNotFound.htm" />-->
    <!--
    </customErrors>-->
    <customErrors mode="Off"/>

    <!--Enable % character-->
    <!--<httpRuntime requestPathInvalidCharacters="<,>,*,:,&,\,?" />-->
    <httpRuntime requestValidationMode="2.0" requestPathInvalidCharacters="<,>,*,&,\,?" />

    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages"/>
      </namespaces>
    </pages>
  </system.web>
  <system.webServer>
    <defaultDocument />
    <httpErrors errorMode="Detailed"/>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
    </modules>

  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
Показать
17. aprol 10.10.12 18:01 Сейчас в теме
хм, помог казалось бы самый бесполезный совет: "обновить публикацию под администратором"
19. blizz2783 08.04.18 12:40 Сейчас в теме
Вот этот хороший) fineproxy
Оставьте свое сообщение