ASP.net

ASP.NET Error «Padding is invalid and cannot be removed»

После того как установил систему оповещения об ошибках, на e-mail как из рога изобилия посыпались ошибки сайта "Padding is invalid and cannot be removed"

Сайт размещен на Shared WIndows хостинге. Скорее всего хостер использует WebFarm. Дополнительные библиотеки - Telerik Controls

На форуме Телерика нашел сообщение о том, что надо прописать MachineKey в файле web.config.

Например

<system.web>  <machineKey    validationKey='A06BDCF2F6CF.A.VERY.LONG.44F13E76184945A7C477601'    decryptionKey='99079B21C2F3644.A.BIT.SHORTER.BB81C7E9D58378'    validation='SHA1'/></system.web>

Не помогло.

Порылся в интернете и нашел вторую меру - прописать запрет к скриптам в файле robots.txt

User-Agent: *
Disallow: /WebResource.axd
Disallow: /ScriptResource.axd

Источники информации:

1. Telerik

2. Fixing “Padding is invalid and cannot be removed” when requesting WebResource.axd

 

System.OutOfMemoryException

Неприятный сюрприз я получил с использованием библиотеки UrlRewritingNet.UrlRewriter.dll.

Не знаю, то ли хостинг слабоват, то ли библиотека не без греха, но через 2-3 дня работы сайт падал с ошибкой "System.OutOfMemoryException", хотя сайт еще не был раскручен и имел 5-7 посетителей в сутки. Техподдержка хостинга вникать в мои проблемы не стала, а просто заявила, что проблема у меня.

На данный момент свои сайты я держу на хостинге comfoplace.com

Поскольку такая ошибка возникла впервые, а сейчас у меня 4 сайта на этом хостинге, то я решил разобраться в чем может быть проблема.

Единственное новшество - дружественные ссылки на основе библиотеки UrlRewritingNet.UrlRewriter.dll.

Ради эксперимента решил отказаться от SEO-ссылок, и оставил как есть с передачей параметра.
И, о чудо! Уже более месяца сайт работает без данной ошибки.
Вот такие дела.

Программное создание ключей шифрования ASP.net

В разделе <machineKey> можно устанавливать специфический для каждого сервера ключ, который должен использоваться для шифрования данных и создания цифровых подписей.

Например

<machineKey
validationkey="61EA...B05D"
decryptionKey="61EA...37AF"
validation="SHA1" />

Значение validationKey может иметь от 40 до 128 символов. Настоятельно рекомендуется использовать ключи максимально возможной длины.

Значение decryptionKey может иметь 16 или 48 символов.

Создавать собственные ключи проверки достоверности и расшифровки не имеет большого смысла. Если же вы все-таки попытаетесь это сделать, они не будут в достаточной мере случайными, что сделает их неустойчивыми к некоторым типам атак. Приемлемым вариантом считается генерирование строго случайного ключа с помощью кода и криптографических классов .NET Framework (System.Security.Cryptography)

Далее показана подпрограмма базового кода, называемая CreateMachineKey(), которая создает случайную серию байтов с помощью криптографически строгого генератора случайных чисел. Метод CreateMachineKey() принимает один параметр, который определяет количество используемых символов. Результатом является шестнадцатеричный формат, который используется в файле machine.config

public static string CreateMachineKey(int length)
{
// создание массива байтов
byte[] random = new byte[length/2];

// создание криптографически строгого генератора случайных чисел
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

// заполнение массива байтов случайными байтами
rng.GetBytes(random);

// создание StringBuilder для хранения результата
// после того как он будет преобразован в шестнадцатеричный формат
System.Text.StringBuilder machineKey = new System.Text.StringBuilder(length);

// Перебор массива случайных байтов и добавление
// каждого значения к StringBuilder
for (int i = 0; i < random.Length; i++)
{
machineKey.Append(String.Format("{0:X2}", random[i]));
}
return machineKey.ToString();
}

Пример использования

txtDecryptionKey.Text=CreateMachineKey(48);
txtValidationKey.Text=CreateMachineKey(128);

Далее Вы можете скопировать эту информацию и вставить ее в файл machine.config

Установка кода Liex на сайт ASP.net

В данной статье рассмотрим один из способов установки тематического кода Liex на сайт на платформе ASP.net с поддержкой PHP (Windows-хостинг).

О том, как установить код биржи, подробно написано на самом сайте Liex.ru

Перед добавлением площадки обязательно нужно установить на нее в папку ****** код биржи. Этой папке нужно дать права на запись (777). После добавления внесите изменения в корневой htaccess (см. пункт меню "Тематики")

На windows-хостинге нет понятия право на запись 777, необходимо разрешить запись в эту папку. В большинстве случаев Вы можете сделать это самостоятельно.

Считаем, что Вы установили скрипт, и теперь надо настроить тематики.

Данные строки нужно вставить в корневой htaccess вашего сайта (если в нем есть другие правила mod_rewrite, то тогда НАД ними):

RewriteEngine On
RewriteRule ^pages/?$ /b33b9479d2e/ [L]
RewriteRule ^stroika/?$ /b33b9479d2e/stroika.php [L]
RewriteRule ^stroika/(\d+)/?$ /b33b9479d2e/stroika_$1.php [L]
RewriteRule ^stroika/([0-9]+).(php|htm|html)$ /b33b9479d2e/$1.$2 [L]
RewriteRule ^in-yaz/?$ /b33b9479d2e/in-yaz.php [L]
RewriteRule ^in-yaz/(\d+)/?$ /b33b9479d2e/in-yaz_$1.php [L]
RewriteRule ^in-yaz/([0-9]+).(php|htm|html)$ /b33b9479d2e/$1.$2 [L]
...

Естественно, ни о каком htaccess на Windows-хостинге речи быть не может.

В качестве аналога RewriteEngine можно использовать бесплатную библиотеку UrlRewritingNet.

Необходимо скачать с сайта библиотеку UrlRewritingNet.UrlRewriter.dll и закинуть ее в папку BIN Вашего проекта.

Прописать в файле web.config необходимые настройки

<?xml version="1.0"?>
<configuration>
<configSections>
<section name="urlrewritingnet"
restartOnExternalChanges="true"
requirePermission="false"
type="UrlRewritingNet.Configuration.UrlRewriteSection,
UrlRewritingNet.UrlRewriter"/>
</configSections>
<urlrewritingnet
configSource="<strong>ExternalRewrite.config</strong>">
</urlrewritingnet>
...
<system.web>
<httpModules>
<add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.urlRewriter"/>
</httpModules>

Обратите внимание, если библиотека UrlRewritingNet не отработала на Вашем хостинге, тогда добавьте в файл web.config следующие строки

<system.webServer>

<modules>
<add name="UrlRewriteModule"
type="UrlRewritingNet.Web.UrlRewriteModule,
UrlRewritingNet.UrlRewriter" />
</modules>

Итак, Вы зарегистрировали библиотеку, теперь необходимо ее настроить. При заданной конфигурации, все настройки будут храниться в файле ExternalRewrite.config

Берем необходимые тематики с сайта Liex и прописываем в конфигурационном файле

Например


<?xml version="1.0"?>
<urlrewritingnet
rewriteOnlyVirtualUrls="true"
contextItemsPrefix="QueryString"
defaultPage = "Default.aspx"
defaultProvider="RegEx"
xmlns="http://www.urlrewriting.net/schemas/config/2006/07" >

<rewrites>

<add name="liexpagesRoot"  virtualUrl="^<strong>~/pages/</strong>"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="<strong>~/b33b9479d2e/main.php</strong>"
ignoreCase="true" />

<add name="liexCinema"  virtualUrl="^~/cinema/([0-9]+).(php|htm|html)"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/b33b9479d2e/$1.$2"
ignoreCase="true" />

<add name="liexCinemaRoot"  virtualUrl="^~/cinema/"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/b33b9479d2e/cinema.php"
ignoreCase="true" />

<add name="liexgrafika"  virtualUrl="^~/grafika/([0-9]+).(php|htm|html)"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/b33b9479d2e/$1.$2"
ignoreCase="true" />

<add name="liexgrafikaRoot"  virtualUrl="^~/grafika/"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/b33b9479d2e/grafika.php"
ignoreCase="true" />

...
</rewrites>
</urlrewritingnet>

Обратите внимание на то, что все имена должны быть уникальны.

Каталог статей в данном примере ~\pages.

Вот и все. Теперь все должно работать. Вам необходимо лишь прописать все темы, либо только те, которые Вы принимаете.

Примечание:

Не каждый windows-хостинг поддерживает PHP и файлы .htaccess. А файл .htaccess автоматически записывается в Вашу папку со статьями.

Примеры Windows-хостинга:

Seattlehost - при наличии файла .htaccess в папке выдает ошибку сервера 500

Godaddy - работает без проблем, файл .htaccess игнорируется

Comfoplace - работает без проблем, только при условии, что в настройках хостинга Вы укажите, что поддержка PHP - запустить как расширение ISAPI

Облако тегов на странице ASP.net (wp_cumulus) Flash

Мне лично, да и многим людям понравилось облако тегов на флэше wp_cumulus.

В интернете я нашел всего несколько страниц, которые описывают как сделать такое облако тэгов на ASP.net.

В качестве первоисточника возьмем статью http://dev.net.ua/blogs/eugenekhvedchenya/pages/8134.aspx

(Не уверен, что это первоисточник, но другой статьи под рукой не оказалось)

Итак.

На днях случайно обнаружил очень красивое "живое" облако тегов на флеше:

Само облако тегов написано на флеше, встраивается в страницу с помощью SWFObject, а данные для визуализации берет из набора передаваемых флеш-объекту параметров. Изначально данный плагин предназначался для WordPress, однако мой пытливый ум сразу сказал - "Мне такое надо! Причем на страницах ASP.NET!"

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

text/javascript">
var widget_so9010252 = new SWFObject("tagcloud.swf?r=1510412", "tagcloudflash", "160", "160", "9", "#f8f8f8");
widget_so9010252.addParam("allowScriptAccess", "always");
widget_so9010252.addVariable("tcolor", "0x5391d0");
widget_so9010252.addVariable("tcolor2", "0x333333");
widget_so9010252.addVariable("hicolor", "0x5391d0");
widget_so9010252.addVariable("tspeed", "100");
widget_so9010252.addVariable("distr", "true");
widget_so9010252.addVariable("mode", "tags");
widget_so9010252.addVariable("tagcloud", ".....");
widget_so9010252.write("wpcumuluswidgetcontent");

Вот и вся магия :) Основная проблема была в том, что параметры облака тегов очень плохо документированы, и пришлось немало порыться, прежде чем все заработало так как надо.

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

Итак, поехали:

[assembly: WebResource("wpCumulus.swfobject.js", "text/javascript")]
[assembly: WebResource("wpCumulus.tagcloud.swf", "application/x-shockwave-flash")]

Флеш-объект и необходимый JS-код встроены в сборку как ресурсы, так что контрол является полностью самодостаточным и не требует для работы никаких дополнительных файлов.
Создаем новый UserControl, который будет уметь рендерить в себе нужный нам JS код:

[ToolboxData("")]
public class WPCumulus : DataBoundControl
{
        ....

        protected override void CreateChildControls()
        {
            ClearChildViewState();
            Controls.Clear();
            Page.ClientScript.RegisterClientScriptResource(GetType(), "wpCumulus.swfobject.js");
        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            var hiddenContentId = ClientID + ClientIDSeparator + "HiddenContent";

            var tagCloud = GenerateTagCloud();
            var script = CreateScriptString(tagCloud, hiddenContentId);

            output.Write(String.Format("", hiddenContentId));
            output.Write("");
            output.Write(script);
            output.Write("");
        }

        ....
}

Как видно из кода, наш класс наследуется от DataBoundControl, что позволяет нам использовать DataBinding для построения списка тегов на основании произвольного источника данных. Для отображения тега в облаке нам необходимы три параметра - Имя Тега, его вес (число ссылок по теме) и ссылка на целевую страницу. За маппинг этих параметров из источника данных отвечают три свойства в классе:

DataTextField - Указывает имя свойства, которое соответствует имени тега.

DataCountField - Указывает имя свойства, которые указывает вес тега.

DataUrlField - Указывает имя свойства, которое соответствует ссылке для данного тега.

Для настройки внешнего вида облака тегов нам доступны следующие параметры:

BackColor - Цвет фона.

TagColor1 - Указывает основной цвет шрифта тега.

TagColor2 - Вспомогательный цвет тега (используется для градиентного перехода при уходе тега на задний план).

HiColor - Цвет тега, когда над ним находится указатель мыши.

TagSpeed - Задает скорость вращения облака (Единицы измерения - попугаи. Оптимальные значения - 20..500 попугаев)

Distr - Булевый параметр отвечает за равномерное распределение тегов по облаку. True - чтобы все было красиво.

MinimumTagSize - Минимальный размер шрифта у тега (для тега с минимальным весом).

MaximumTagSize - Максимальный размер шрифта у тега (для тега с максимальный весом).

Применение контрола:

Сперва опишем наш элемент управления в коде ASPX:
<cc1:WPCumulus ID="WPCumulus1" runat="server" DataCountField="Count"
        DataTextField="Text" DataUrlField="Link" Width="400" Height="400"
        BackColor="#CCCCCC" HiColor="#66FF33" TagColor1="Red" TagColor2="Blue"  Distr="True"  />
Теперь в файле отделенного кода мы можем привязаться к облаку тегов:
WPCumulus1.DataSource = new[]{
                              new {Text = "Silverlight", Count = 10, Link="/Tags/Silverlight" },
                              new {Text = "IIS 7", Count = 11, Link="http://iis.net" },
                              new {Text = "IE 8", Count = 12, Link="/Tags/IE8" },
                              new {Text = "C#", Count = 13, Link="/Tags/C#" },
                              new {Text = "Azure", Count = 13, Link="?Tag=Azure" }
                             };
WPCumulus1.DataBind();

В результате должно получиться что-то такое:

Приятного использования!

Исходники контрола и демо можно скачать тут: http://flashtagcloud.codeplex.com/

Вместо заключения

Уже после написания контрола нашел в сети аналог для BlogEngine. Но во-первых, их версия заточена под движок и, следовательно, не реюзабельна. Во-вторых написана ногой через голову.

Ограничения Фичи

1) Облако "падает" при большом количестве тегов (Более 400).

2) Не поддерживается кирилица.

Я предлагаю Вам скачать библиотеку wp_cumulus уже с поддержкой кирилицы.

wp_cumulus for ASP.net with Cyrylic