пятница, 8 июля 2011 г.

Webexception: Слишком много попыток автоматического перенаправления

Или так: "Webexception: Too many redirects".
Неблагодарное занятие парсить html страницы. Постоянно приходится менять код.Полгода приложение работало нормально закачивало ссылку, а теперь выдает ошибку. Chrome качает без проблем, а программа не может. Пришлось разбираться с помощью Fiddler.
   Итак можно четко увидеть, что на мой запрос сервер возвращает HTTP 302, то есть делает редирект на ту же самую страницу (Location:  http://etp.zakazrf.ru/Reductions.aspx), одновременно устанавливает cookies (Set-cookies: ASP.NET_SessionId....).  В моем приложении  cookies не обрабатовались, поэтому  программа постоянно получала HTTP 302, делала редирект на Location, и так по кругу, пока счетчик перенаправлений не сравнялся с параметром
request.MaximumAutomaticRedirections ( по умолчанию равен 50).
Пришлось изменить код

вторник, 30 ноября 2010 г.

Visual Studio С# 2010 Express. Не сохраняются данные в базе.

 Я потерял часа три на то, что бы понять, почему, когда я вызываю функцию DataContext.SubmitChanges(), данные в базе данных не обновляются. При этом никаких ошибок нет. Если в точно такую же ситуацию попали и вы, советую почитать вот здесь:
http://www.visualstudiodev.com/visual-c-express-edition/tableadapter-not-inserting-rows-to-the-database-43671.shtml
Если коротко, то при отладке программы в Visual Studio C# Express, файл базы данных копируется в каталог "(ProjectDir)\bin\Debug\mydatabase.mdb" и все изменения происходят уже в этой базе. Их не увидишь, пока не сделаешь еще одно подключение в проекте на этот файл базы данных. Ну а если эти данные важны для вас, то придется вручную заменить оригинальный файл базы данных на файл временной  базы. До этого я использовал Visual Studio Web Developer 2008 Express, ничего такого там не было.

суббота, 13 ноября 2010 г.

Осваиваем LINQ to XML

Как я описал в предыдущем посте Разбор HTML в Microsoft C Sharp запрос по URL  http://sberbank-ast.ru/PurchaseList.aspx возвращает данные  в XML формате. Нам нужно их разобрать. Как раз есть повод применить LINQ to XML. Сразу посоветую книжку для изучения. Авторы: Джозеф Албахари, Бен Албахари. Название - "LINQ карманный справочник". Очень доходчиво написано.
В этой книжке также есть ссылка на программу LINQPAD, где можно поупражняться в написании запросов на LINQ. Программа бесплатная, но за такой сервис, как "autocompletion" (аналог intellisense в Visual Studio) придется заплатить. Итак имеем XML структуру :

Допустим нам нужно найти purchID по определенному фильтру. Вот как выглядит код:


То есть мы выводим идентификаторы тех аукционов, которые в своем наименовании содержат слово "Поставка", и их ID больше 58061, и в описании встречаются или "Саратов" или "Москва".
Есть один момент, который меня не устраивает в этом коде. Хотелось бы, чтобы фильтр был универсальным. Например, я хочу включить несколько городов.  Понятно, что здесь нужно использовать деревья-выражения. Вот здесь мне и помог  Джозеф Албахари. Он написал универсальные extension функции для типа Expression < Func <T,TResult>>. По этой ссылки вы найдете их определения и примеры использования.
Dynamically Composing Expression Predicates
А теперь как изменился код:




Обратите внимание на Compile(). Мне пришлось использовать эту функцию для того что перевести дерево-выражение в лямбда-выражение , так как запрос локальный и возвращает тип IEnumerable, а не интерпретируемый, который возвращает IQueryable. Разница между двумя типами  описана в книге "LINQ карманный справочник".

среда, 10 ноября 2010 г.

Разбор HTML в Microsoft C Sharp

Приятно когда опытные программисты делятся полезными идеями и даже кодом своих программ. Вот один из примеров. Для своего нового проекта мне понадобился разборщик HTML. Мне нужен очень простенький, где я мог бы для определенного атрибута вытащить его значение. В принципе в сети нашел несколько вариантов. Но остановился вот на этом:
Parsing HTML in Microsoft C#.
Очень советую. Все просто и нагладно показано.   Вот пример как я его использую. Мне нужно получить реестров аукционов с сайта http://sberbank-ast.ru/PurchaseList.aspx  Посмотрев HTML -код страницы нашел тег input c атрибутом name="ctl00$ctl00$phWorkZone$xmlData"  - это для меня ключ поиска, но а потом у этого же тега вытаскиваю значение атрибута value со списком новых аукционов < input name="ctl00$ctl00$phWorkZone$xmlData" text="text" value="..здесь данные которые мне нужны...      Вот код для получения этих данных:



tag ["value"].Value не совсем еще XML. Просто вместо "<" стоит &lt  поэтому и понадобилась процедура для замены. Вот код этой процедуры



Вывод программы примерно следующий:

среда, 22 сентября 2010 г.

Настройка URLScan

Почитав некоторые материалы в сети ( например: http://www.hanselman.com/blog/HackedAndIDidntLikeItURLScanIsStepZero.aspx
http://haacked.com/archive/2008/08/22/dealing-with-denial-of-service-attacks.aspx), я пришел к выводу, что к моему написанному приложению ASP.NET нужно срочно приделать URLscan.
Итак, качаем отсюда http://www.iis.net/download/urlscan . Устанавливаем на сервере. В каталоге c:\windows\system32\inetsrv\ появляется новая папка urlscan.
В ней два файла urlscan.dll и urlscan.ini. Эти файлы отвечают за глобальную фильтрацию всех сайтов, расположенных на сервере. Но можно настроить и отдельно для каждого сайта. Для этого нужно скопировать эти два файла в корневой каталог. Например, у меня корневой каталог моей программы (сайта) c:\Inetpub\foo.  Так как у меня права NTFS на корневой каталог только "чтение", на файл urlscan.dll пришлось дать права "чтение и выполнение" пользователю IIS_WPG. Теперь идем в "Диспетчер служб IIS" . Правой клавишей мыши достаем свойства сайта и в закладке "фильтр ISAPI" добавляем urlscan из корневой директории.
По умолчанию urlscan.ini уже содержит настройки фильтрации. Но я хотел все-таки несколько увеличить безопасность. Для начала  нужно настроить лог. В urlscan.ini  существует параметр для указания пути к лог файлу "LoggingDirectory". Я указал c:\InetPub\foo\logs. После этого не забудьте  дать NTFS права на "запись" IIS_WPG и IIS права на "запись" на этот каталог.
 Потом прошелся по настройкам в urlscan.ini. Во первых, я включил (то есть установил в единицу) параметр UseAllowExtensions=1. Это значит будет отрабатывать секция [AllowExtensions] , если параметр 0 - то отрабатывет [DenyExtensions].  У меня она выглядит так
[AllowExtensions]
.
.css
Это список разрешенных раcширений. У меня получился вот такой маленький.
 "." точка нужна для файлов без раcширений. Без этой точки у меня приложение не запускалось.
Затем я переключился на параметры в секции [RequestLimits]
MaxAllowedContentLength=30000000
MaxUrl=260
MaxQueryString=2048
Это явно излишне для моего сайта. Немного теории . Как вы знаете, протокол HTTP использует два метода запроса к серверу GET и POST. Они отличается тем,что при методе GET запрос как бы является частью URI. Например http://www.google.ru/search?source=ig&hl=ru&rlz=1R2GFRE_ruRU333&q=urlscan&aq=f&aqi=g10&aql=&oq=&gs_rfai=
 и тело запроса пусто . А при методе POST данные передаются в теле запроса.  Так вот параметр "MaxAllowedContentLength" как раз относится к POST, а  "MaxQueryString" - GET. MaxUrl - это максимальное количество символов в строке URL без QUERY_STRING. Опытным путем я вычислил следующие значения
MaxAllowedContentLength=30
MaxUrl=30
MaxQueryString=60

пятница, 18 июня 2010 г.

Проблемы локализации меню DotNetNuke 5.x.x

Сразу скажу эту проблему я так и не решил . Просто не сложилась мозаика из DotNetNuke 5 , меню, и шаблона(skin). Теперь все по порядку.

Так как у меня уже есть один сайт на DotNetNuke 4.5, я смело принялся создавать страницы с названиями на русском языке. Но стоп, они не открываются . Они даже потом не редактируются. Их можно только удалить. Я не придал этому большого значения, отложил это на потом  и принялся искать по интернету бесплатные скины и модули. Мне нужен был модуль фото галерея . Я нашел даже два . Вот ссылки:
Photo Gallery - http://oliverhine.com/DotNetNuke/Modules/PhotoGallery.aspx
WnsLightbox Gallery -http://wnslightbox.codeplex.com/
Подобрал себе скин вот отсюда:
http://www.dnnskins.com/

Перехожу к руссификации меню.

Итак, 1 вариант, который я испытал - DSlocalizator http://dnn.tiendaboliviana.com/
На сайте выложена версия 03.00.04 бета. Сколько я не пытался ничего не получилось . А  на DotnetNuke 4 DSLocalizator работает на ура.

2 вариант - EALO  http://ealo.codeplex.com/releases/view/33940
Качаем EALO CoreAPI и EALO Tab localization. Почитайте Readme на сайте, потому что в дистрибутивах его нет. В принципе все понятно . После установки , просто добавьте модуль EAOL tab на какую нибудь страницу и укажите русский вариант всех своих страниц. Я смог руссифицировать стандарное меню , но вот меню моего скина нет. Нет в моем скине dnn:nav ..., а есть dnn:menu.. и, как я понял из форума, EALO мне не поможет http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/77/threadid/350801/scope/posts/Default.aspx

3 вариант - DNN menu http://www.dnngarden.com/ . Для руссификации должен быть установлен EALO.  Попытка была для меня тоже неудачной. Руссифицировать получилось, но модуль работал нестабильно, в какой-то момент, почему-то слетал style тага td, в котором был пункт меню, и он становился черным. Возможно все мои проблемы были из-за выбранного мною скина.

В итоге, я установил DotNetnuke 4.9.5 и DSLocalizator. Но, к сожалению, модули фото галерей были только под пятерку. Пришлось искать . Фришных нет вообще.
Вот удалось отсюда скачать
http://www.labellarte.it/DotNetNuke/DnnThickGallery12/tabid/438/Default.aspx

Установка DotNetNuke 5.4.1

У меня уже есть опыт разворачивания сайта DotNetnuke только ранней четверки. Теперь решил взяться за пятерку. Вот некоторые нюансы установки.У вас уже должен быть установлен SQL Express, IIS и Net Framework как минимум 2.

1. Заходим по ссылке качаем дистрибутив
http://www.dotnetnuke.com/tabid/125/default.aspx

2. Полученный архив распаковываем в c:\DotNetNuke

3. Находим файл readme.txt в c:\DotNetNuke\documentation и
выполняем требования описанные в этом файле.
 На каталог c:\DotNetNuke даем полные права ASP_NET юзеру, если конечно у вас XP.
 Создаем базу данных DotNetNuke в SQLExpress и пользователя, например dnnuser, с правами "db_owner".
Редактируем connectionstring в web.config .
Заходим в IIS создаем виртуальный каталог DotNetNuke, указывающий на  c:\DotNetNuke. Файл default.aspx должен быть документом по умолчанию.

4. Запускаем IE . Вводим в строке localhost/dotnetnuke.
Тут же у меня вылетела ошибка. Оказывается, если IIS был установлен после Net Framework, необходимо выполнить c:\Windows\Microsoft.Net\Framework\v2.0.50727\aspnet_regiis.exe

5.  Дальше проходим программа установки запрашивает информацию. Коротко несколько нюансов.
При выборе установки по умолчанию устанавливается только один модуль "Text/HTML".

Выполнение скриптов может завершиться с ошибкой. Хотя это и не указано в Readme.txt, но необходимо дать права на запись на каталог c:\windows\temp учетной записи ASP_NET.

После установки сразу же качаем устнавливаем language pack
http://www.dotnetnuke.com/Development/LanguagePacks/tabid/933/Default.aspx
Кстати, он в пятерке устанавливается как обычный модуль.