Форум SAPE.RU

Форум SAPE.RU (http://forum.sape.ru/index.php)
-   Установка кода на различные движки (http://forum.sape.ru/forumdisplay.php?f=26)
-   -   Новый код для платформы ASP.NET (http://forum.sape.ru/showthread.php?t=25784)

fearg0 28.08.2010 17:47

Если код вывода ссылок стоит внутри UserControl какого-нибудь, то получается что мой UserControl рендерит ваш, поэтому события OnInit и OnLoad не вызываются - как результат Null Reference Exception.
Для проверки:

default.aspx
<%@ Page Language="C#" AutoEventWireup="false" %>
<%
System.Text.StringBuilder sb = new System.Text.StringBuilder();
System.IO.StringWriter tw = new System.IO.StringWriter(sb);
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
System.Web.UI.Control ctrl = Page.LoadControl("control.ascx");
ctrl.RenderControl(hw);
Response.Write(sb.ToString());
%>

control.ascx содержит код показа ссылок:
<%@ Control Language="C#" AutoEventWireup="false" %>
<efe:SapeLinks ID="SapeLinks1" runat="server"/>

Сделал костыль в SapeLinks.cs вида
...
private bool _initizlized=false;
private bool _loaded = false;
...
protected override void OnInit(EventArgs e)
{
_initizlized = true;
...
protected override void OnLoad(EventArgs e)
{
_loaded = true;
...
protected override void Render(HtmlTextWriter writer)
{
if (!_initizlized) OnInit(null);
if (!_loaded) OnLoad(null);
...

effetto 28.08.2010 17:53

Приветствую, fearg0.

Согласно классическому стилю реализации вы неправильно унаследовали методы-обработчики событий. Вы можете или унаследовать их правильно:
Код:

        protected override void OnInit(EventArgs e)
        {
            _initizlized = true;
            base.OnInit(e);
        }

Или, если ваша реализация принципиально должна быть таковой, можете использовать вывод ссылок посредством кода. Инструкция об этом процессе есть в документация, а ссылка на документацию - в первом сообщении темы.

SerZH 04.09.2010 18:47

Вот такая вот ошибка сегодня возникла (код новый версии 0.5):

[ArgumentNullException: Значение не может быть неопределенным.
Parameter name: key]
System.ThrowHelper.ThrowArgumentNullException(Exce ptionArgument argument) +44
System.Collections.Generic.Dictionary`2.FindEntry( TKey key) +7457569
System.Collections.Generic.Dictionary`2.get_Item(T Key key) +12
effetto.Sape.RussianNormalizer.GetFixedUrl(String url) +571
effetto.Sape.SapeUrl..ctor(String rawUrl, String getParams) +55
effetto.Sape.SapeControl.OnInit(EventArgs e) +221
effetto.Sape.SapeLinks.OnInit(EventArgs e) +15
System.Web.UI.Control.InitRecursive(Control namingContainer) +333
System.Web.UI.Control.InitRecursive(Control namingContainer) +210
System.Web.UI.Control.InitRecursive(Control namingContainer) +210
System.Web.UI.Control.InitRecursive(Control namingContainer) +210
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +378

SerZH 05.09.2010 22:44

Попробовал удалить файл sape.bin, вот что теперь выводит (сам файл создался автоматом снова):

Server Error in '/' Application.
Данный ключ отсутствует в словаре.
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.Collections.Generic.KeyNotFoundException: Данный ключ отсутствует в словаре.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[KeyNotFoundException: Данный ключ отсутствует в словаре.]
System.ThrowHelper.ThrowKeyNotFoundException() +28
System.Collections.Generic.Dictionary`2.get_Item(T Key key) +7455948
effetto.Sape.RussianNormalizer.GetFixedXML(String url) +195
effetto.Sape.SapeFactory.RequestHostFromDispenser( SapeUser user, String hostname) +472
effetto.Sape.SapeFactory.GetHost(SapeUser user, String host) +421
effetto.Sape.SapeControl.OnInit(EventArgs e) +137
effetto.Sape.SapeLinks.OnInit(EventArgs e) +15
System.Web.UI.Control.InitRecursive(Control namingContainer) +333
System.Web.UI.Control.InitRecursive(Control namingContainer) +210
System.Web.UI.Control.InitRecursive(Control namingContainer) +210
System.Web.UI.Control.InitRecursive(Control namingContainer) +210
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +378


Version Information: Microsoft .NET Framework Version:2.0.50727.4952; ASP.NET Version:2.0.50727.4927

SerZH 24.09.2010 22:53

Товарищи, помогите всё-таки разобраться, ошибка повторяется.

lurii 25.09.2010 05:43

На странице выдается
Код:

<!--check code-->
В app_data лежит непустой sape.bin, при удалении создается.
При переводе флага CacheInSQL="false" в true - вылезает ошибка.
Походу табла dbo.sape не создалась, в исходниках есть dc.dbml - там похожая, вручную создавать?? (давайте код таблички)

Код:

<?xml version="1.0" encoding="windows-1251" ?>
<!-- SERVER -->
<configuration>

        <!-- sape -->
        <configSections>
                <sectionGroup name="effetto.Sape">
                        <section name="SapeConfig"
                                type="effetto.Sape.SapeConfigSection, SAPE"
                                allowLocation="true"
                                requirePermission="false"
                                allowDefinition="Everywhere"/>
                </sectionGroup>
        </configSections>
        <connectionStrings>
      <add
      name="SapeConnectionString"
      connectionString="
              data source=db_srv;
              database=db_name;
              User ID=db_log;
              Password=db_pwd;
              "/>
        </connectionStrings>
        <effetto.Sape>
                <SapeConfig UserId="uid"
                        CacheTimeout="60"
                        CacheInSQL="false"
                        ConnectionStringName="SapeConnectionString"
                        SystemId="47474747-4747-4747-4747-474747474747"
                        ExpireTimeout="600"
                        Host=""
                        UrlAnalyzer="true"
                        QueryAnalyzer="true"
                        QueryFilter="false"
                        QueryParameters=""
                        IgnoreCase="true"
                        RussianNormalizer="true"
                        ForceCheckCode="true">
                        <DefaultDocuments>
                                <add Name="Default.aspx" />
                        </DefaultDocuments>
                </SapeConfig>
        </effetto.Sape>

        <system.web>
            <pages
                        buffer="true"
                        enableSessionState="true"
                        enableViewState="false"
                        validateRequest="false"
                        autoEventWireup="false"
                    >
                        <!-- sape -->
                    <controls><add tagPrefix="efe" namespace="effetto.Sape" assembly="SAPE"/></controls>
            </pages>
...

Код:

Server Error in '/' Application.
Invalid object name 'dbo.sape'.
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.Data.SqlClient.SqlException: Invalid object name 'dbo.sape'.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[SqlException (0x80131904): Invalid object name 'dbo.sape'.]
  System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +1953274
  System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4849707
  System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194
  System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2392
  System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33
  System.Data.SqlClient.SqlDataReader.get_MetaData() +96
  System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +297
  System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +954
  System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162
  System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
  System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
  System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
  System.Data.Common.DbCommand.ExecuteReader() +12
  System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) +332
  System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) +113
  System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +344
  System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute(Expression expression) +23
  System.Linq.Queryable.Count(IQueryable`1 source) +240
  effetto.Sape.SapeFactory.LoadBase() +523
  effetto.Sape.SapeFactory..ctor() +287
  effetto.Sape.SapeFactory.get_Factory() +29
  effetto.Sape.SapeControl.OnInit(EventArgs e) +47
  effetto.Sape.SapeLinks.OnInit(EventArgs e) +15
  System.Web.UI.Control.InitRecursive(Control namingContainer) +333
  System.Web.UI.Control.InitRecursive(Control namingContainer) +210
  System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +378


Version Information: Microsoft .NET Framework Version:2.0.50727.4206; ASP.NET Version:2.0.50727.4205

Добавлено через 35 минут
Создал табличку:
Код:

create table [dbo].sape(
        Id UNIQUEIDENTIFIER DEFAULT NEWID(),
        Data VarBinary(MAX) NOT NULL
)

Удалил из app_data, изменил флаг на CacheInSQL="true"
В таблу занеслась одна строка с кодом и байтами, в app_data пусто.
На странице все-равно вылазиить только код:
Код:

<!--check code-->
Перевел флаг на ForceCheckCode="false" - стало вообще пусто ...
На странице установлен:
Код:

<efe:SapeLinks runat="server"/>
Куда дальше копать?

Добавлено через 3 минуты
Занес Host="my_domain.ru" - все равно пусто

effetto 25.09.2010 11:02

2lurii: Сайт в сапу добавился? модерацию прошел? ссылки есть? если сылок нет, то вывод и должен быть пустым или только чек код.

Добавлено через 1 минуту
2 SerZH: отправил модуль на тестирование, так как такую ошибку наши ребята уже исправляли. Ошибка повяляется часто? можете выслать бинарник данных?

lurii 25.09.2010 18:05

Цитата:

Сообщение от effetto (Сообщение 915392)
2lurii: Сайт в сапу добавился? модерацию прошел? ссылки есть? если сылок нет, то вывод и должен быть пустым или только чек код.

1) Понял, значит заработало (не добавлял, не проходил, нет), а после какой код должен выводиться?
2) Почему автоматом не создалась таблица? - нет проверки ее существования или просто не обернуто в исключение?
3) Может сделать флаг debug который бы выводил текущую операцию и статус ее успешной обработки? - в конце типа ОК - все в норме.
4) Урлы и их ссылки хранятся в бинарнике и будут нагружать память при каждом обращении к странице?

effetto 25.09.2010 19:34

1) никакого или чек код, если он включен;
2) автоматом она не создается, таблица примитивная а используют этот метод единицы, создайте если нужна, в документации все описано;
3) все и так ок, если вы видете чек код, для этого он и создан;
4) урлы и ссылки хранятся в одном экземпляре для всех страниц, тестирование показало, что для высоко и среждне нагруженых ресурсов эти жертвы ничто по сравнению с затратами на чтение из файла, если данные в памяти не хранить.

lurii 01.01.2011 18:30

Вопрос по размещению одной ссылки, но в разных местах страницы.
Место вывода рассчитывается:
int ban_pos=ban_pos_calc(2,re("id"));
и далее на странице должно выводится в одной из позиций конструкцией:
if(ban_pos==1){%><!--#include virtual="/sape.aspx"--><br /><%};
...
if(ban_pos==2){%><!--#include virtual="/sape.aspx"--><br /><%};
Соответственно выводится только баннер с позицией 1, т.е. приоритет вывода одинаковый и вторая позиция всегда в пролете ... а инклуды отрабатывают оба ... (даааа, это не php)

Как поступить?
(ссылка на странице одна, но должна выводиться в разных местах)

Добавлено через 16 часов 55 минут
доперло, ставлю в нужном месте:
<%Response.Write(SapeFactory.Factory.GetUser().Get Host().GetPageOrDefault().GetLinksAsString());%>
теперь ссылка выводится по рандому


Часовой пояс GMT +3, время: 08:38.

Работает на vBulletin® версия 3.8.7.
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Перевод: zCarot
SAPE.RU — система купли-продажи ссылок с главных и внутренних страниц сайтов.