понедельник, июля 21, 2008

WCF-service installation on IIS|ASP.NET

Столкнулся с такой проблемой: после перестановки iis и перерегистрации asp.net перестала работать wcf инфраструктура, точнее, на все запросы операций wcf-сервиса, который хостился под iis, всегда получал 404.3;

Решение в перерегистрации самого wcf (правда, я все равно до конца так и не понял, почему wcf, изначально установленный в процессе инсталляции .net 3.5, упал после перестановки iis, возможно все вдело в кривизне моих рук)..

Проблема и решение было найдено на:
http://blogs.msdn.com/davidwaddleton/archive/2007/11/02/wcf-and-404-3-errors.aspx



kept getting 404.3 errors, so I started examining IIS to make sure that the right
stuff is registered. After not finding anything wrong, I started looking at the WCF
installation. I found that my WCF services where not installed. You can do the
installation manually by running "ServiceModelReg.exe", which was found at
%Windows%\Microsoft.Net\Framework\v3.0\Windows Communication Foundation\.




Сам процесс перерегистрации:

Проверить статус wcf:
serviceModelReg -vi


Если получим сообщение "Default Installation" - wcf установлен, иначе, требуется перестановка wcf;

Инсталляция WCF:
serviceModelReg -i


как результат, установленный под iis инфраструктура wcf;


пятница, июля 18, 2008

Перестала работать UpdatePanel :)

Что удивительно, она перестала работать :) то есть все тригерные контролы стали приводить не просто к перегрузке содержимого updatePanel, а к полной перегрузке страницы, т.е. чего хотелось избежать ( именно постбеков) так и не получилось...

причем в процессе отладки было видно, что серверный код обработчика вызывается, но на стороне клиента происходит исключение вида (все таки отладка на стороне клиентского js великая сила :)) -

Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled.

т.е. судя по всему, тот код который отдавался в процессе калбека со стороны сервера клиенту в onSuccessHandler не мог быть распарсен, что приводило к тому, что updatepanel не могла перерисовать свое содержимое, и наверно самое верное решение со стороны ajax client runtime было обновить всю страницу ..


на самом деле, сразу было очевидно то, что дело было в движке проекта или в сайте, в работе самого ajaxToolkit script manager сомневаться не приходилось, так как на отдельном простеньком сайте скрипт менеджер и update panel вели себя так как и положено;

порывшись полчаса в инете, наткнулся на интересное описание того как избежать таких ситуаций:

http://weblogs.asp.net/leftslipper/archive/2007/02/26/sys-webforms-pagerequestmanagerparsererrorexception-what-it-is-and-how-to-avoid-it.aspx

а именно:
вырезка

Why do I keeping getting a PageRequestManagerParserErrorException?

Well, chances are you're doing one of the things mentioned in the error message. Here are the most common reasons and why they don't work:

1.
Calls to Response.Write():
By calling Response.Write() directly you are bypassing the normal rendering mechanism of ASP.NET controls. The bits you write are going straight out to the client without further processing (well, mostly...). This means that UpdatePanel can't encode the data in its special format.
2.
Response filters:
Similar to Response.Write(), response filters can change the rendering in such a way that the UpdatePanel won't know.
3.
HttpModules:
Again, the same deal as Response.Write() and response filters.
4.
Server trace is enabled:
If I were going to implement trace again, I'd do it differently. Trace is effectively written out using Response.Write(), and as such messes up the special format that we use for UpdatePanel.
5.
Calls to Server.Transfer():
Unfortunately, there's no way to detect that Server.Transfer() was called. This means that UpdatePanel can't do anything intelligent when someone calls Server.Transfer(). The response sent back to the client is the HTML markup from the page to which you transferred. Since its HTML and not the special format, it can't be parsed, and you get the error.

How do I avoid getting a PageRequestManagerParserErrorException?

To start with, don't do anything from the preceding list! Here's a matching list of how to avoid a given error (when possible):

1.
Calls to Response.Write():
Place an or similar control on your page and set its Text property. The added benefit is that your pages will be valid HTML. When using Response.Write() you typically end up with pages that contain invalid markup.
2.
Response filters:
The fix might just be to not use the filter. They're not used very often anyway. If possible, filter things at the control level and not at the response level.
3.
HttpModules:
Same as response filters.
4.
Server trace is enabled:
Use some other form of tracing, such as writing to a log file, the Windows event log, or a custom mechanism.
5.
Calls to Server.Transfer():
I'm not really sure why people use Server.Transfer() at all. Perhaps it's a legacy thing from Classic ASP. I'd suggest using Response.Redirect() with query string parameters or cross-page posting.



в сущности все сводится к тому, чтобы избежать ручного responce.write(); вспомнив, что в проекте используется дополнительный httpModule, который выводит отладочную информацию и который собственно говоря и осуществляет write(), пришлось его отключить в пользу нормальной работы script manager & update panel, что и позволило избежать вышеописанной ошибки...


SQL Web Assistant procedures exceptions

SQL Server blocked access to procedure 'sys.xp_makewebtask'

Досталась в наследство следующая логика: в базе данных на определенной таблице (назовем ее не задумываясь test_table) в триггере на добавление записи пере/создавался файл в определенном каталоге, за которым собственно следил механизм типа file watcher в рамках web site - ну вот такая логика ни что не поделаешь - т.е. суть как я понимаю (до сих пор я много чего не могу понять в определенных моментах проекта) при добавлении записи в таблицу test_table дернуть сайт на выполнение определенной операции, т.е. эдакий механизм messaging & notification между sql server и web application, причем однонаправленный :)...

создание файла со стороны sql server происходило не иначе как через

master.dbo.sp_makewebtask

ну вот такой способ, суть не в этом, а в том , что при очередном переезде на новые сервера данный механизм стал глючить, а именно, при добавлении записи в таблицу test_table стал происходить exception следующего вида:


SQL Server blocked access to procedure 'sys.xp_makewebtask' of component 'Web Assistant Procedures'
because this component is turned off as part of the security configuration for this server.
A system administrator can enable the use of 'Web Assistant Procedures' by using sp_configure.
For more information about enabling 'Web Assistant Procedures',
see "Surface Area Configuration" in SQL Server Books Online.
The statement has been terminated.




Решение состоит в том, чтобы просто разрешить выполнения процедур Web Assistant Procedures:


sp_configure 'Web Assistant Procedures'
sp_configure 'Web Assistant Procedures', 1
reconfigure with override



однако, дальше случается следующее: при попытке записи в текстовый файл:


execute master.dbo.sp_makewebtask @outputfile = 'D:\Cache\cache.txt', @query = N'SELECT top 1 * FROM dbname.dbo.test_table'



получаю сообщение о невозможности произвести такую операцию, так как не хватает прав;

Решением ситуации становится разрешение для данного конкретного файла cache.txt на запись для пользователя everyone;


но и это не все :), ситуация развивается дальше:


SQL Web Assistant: Could not open the output file.


на продакшн системе ситуация следующая: sql server instance находится на одном сервере, web server application на другом,
при этом нужно настроить db server таким образом что при добавлении/изменении/удалении записей в нашу test_table срабатывал триггер,
который дергает процедуру master.dbo.sp_makewebtask, которая в свою очередь просто создает файл cache.txt в указанном каталоге (воооот)...
Но!!! сам файл должен находится на сервере web application в указанном через конфиг каталоге (помним, за ним смотрим file watcher)...
Каталог был расшарен, разрешен доступ для everyOne | quests, даны полные права на доступ, master.dbo.sp_makewebtask вызывал
с указанием пути к файлу через UNC имя, но сообщение

SQL Web Assistant: Could not open the output file.

о невозможности записи в файл так и возникало....
(Установка прав на запись для пользователя evereone ни к чему не привела, сообщение об ошибке так и возникало)

порывшись в инете, нашел решение:


How to use UNC name with sp_makewebtask in sql server

(
вырезка:


10 Apr 2008, 1:58 PM UTC
Jonathan Kehayias
These stars recognize your participation in the forums. For more information about the different levels of stars, and how points are earned, please see the FAQ.
Answerer


Posts 2,350

Answer Re: How to use UNC name with sp_makewebtask in sql server
Answer Was this post helpful ? Reply Quote


The Service Logon Account for SQL Server will need to have access to
the that shared path to read or write from there.
If SQL Server is running as Local System, you should change this to a
dedicated login account to a set user, and then grant that user
access to the shared path you want:


http://support.microsoft.com/kb/283811


Also, you can't use mapped drives like you would probably expect.
The drive is mapped at login, and is not actually a persistent drive available to the services.


)



How to change the SQL Server or SQL Server Agent service account without using SQL Enterprise Manager in SQL Server 2000 or SQL Server Configuration Manager in SQL Server 2005


http://support.microsoft.com/kb/283811



Вообщем, как итог, решение состоит в том, чтобы запустить инстанс sql server от имени учетной записи, но не local system, а той, которой разрешены
права на запись в указанный расшаренный каталог, в моем случае я просто запустил Sql server от имени administrator сервера (если подумать, то это конечно дыра в безопасности, но как временное решение до переделки самого механизма вполне достаточно):

Следующий тест должен пройти успешно:


declare @file_location varchar(100)
set @file_location = '\\unc name of web application server\TemporaryFiles\cache.txt'

execute master.dbo.sp_makewebtask @outputfile = @file_location, @query = 'SELECT top 1 * FROM dbo.test_table'





Самое интересное то, что сделав через network mapping отдельный диск, замапленный на расшаренную папку, и указав для master.dbo.sp_makewebtask путь через
такой замапленный диск, получаем предыдущее сообщение об ошибке.



Msg 16821, Level 11, State 1, Procedure sp_makewebtask, Line 131
SQL Web Assistant: Could not open the output file.




т.е. в любом случае нужно использовать unc name;

ps: sorry за сумбурную форму написания, надеюсь, данный пост будет комунить интересен и поможет в решении похожей проблемы


An error occurred creating the configuration section handler for system.serviceModel/behaviors

При очередной выкладке wcf-сервиса в рамках нашего проекта стало возникать исключение следующего плана:



Configuration Error
Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.

Parser Error Message: An error occurred creating the configuration section handler for system.serviceModel/behaviors: Extension element 'authorizationBehavior' cannot be added to this element. Verify that the extension is registered in the extension collection at system.serviceModel/extensions/behaviorExtensions.
Parameter name: element

Source Error:


Line 449:













Проблема в том, что наш Extension element -> 'authorizationBehavior' является объектом указанного через атрибут Type типа, а именно:








решением проблемы является указания full qualified name для сборки, т.е. требуется указывать номер версии, токен и культуру:









это конечно не есть хорошо (теперь при каждлой новой выкладке нужно уточнять номер версии), но другого вариант пока нет, причем такой баг был выялен только при переходе на новую development system, что удивительно потому что на старой системе такого не наблюдалось...

проблема описана здесь:
http://nayyeri.net/blog/configuration-error-for-custom-behavior-extensions-in-wcf/
https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=216431

четверг, июля 17, 2008

DevExpress AspxExperience

Столько всего можно расписать по данной замечательной :) библиотеке, особенно о том, как красиво там реализована поддержка ajax, валидаторы, клиентские handlers, калбеки, да много всего , не перечислишь , но... пока ...точнее все еще .... в проект его не купили, или купили но ключик еще не дали :)

вообщем....дайтееее!!!! мне ключ !!!!!

крик души мля...жду полгода ....сил нет... :) ///

This message cannot support the operation because it has been copied

Собственно, возникла такая нехорошая проблема при разработке собственного message inspector, при очередной попытке прочитать body у message пришлось натолкнуться...

Проблема и ее решение описаны на официальном сайте команды разработки wcf:


http://wcf.netfx3.com/blogs/wcf_team_bloggers/archive/2006/07/26/This-message-cannot-support-the-operation-because-it-has-been-copied.aspx
http://blogs.msdn.com/drnick/archive/2006/07/26/This-message-cannot-support-the-operation-because-it-has-been-copied.aspx



можно привести кусок кода в моем случае:

protected override Message OnAfterReceivedRequest(string authToken, Message request)
{

// проблема описана в WCF
// http://wcf.netfx3.com/blogs/wcf_team_bloggers/archive/2006/07/26/This-message-cannot-support-the-operation-because-it-has-been-copied.aspx
// http://blogs.msdn.com/drnick/archive/2006/07/26/This-message-cannot-support-the-operation-because-it-has-been-copied.aspx
// This message cannot support the operation because it has been copied
// This message cannot support the operation because it has been readed

MessageBuffer buffer = request.CreateBufferedCopy(int.MaxValue);
Message returnMessage = buffer.CreateMessage();
string parameters = buffer.CreateMessage().GetReaderAtBodyContents().ReadInnerXml();
buffer.Close();


string action = request.Headers.Action;
AuthorizationManager.RegistryOperationInvocation(authToken, action, parameters);

return returnMessage;
}



т.е. суть решения сводится к тому, чтобы работать каждый раз с копией message, а не с самим сообщением...

Ajax: The system cannot locate the resource specified;

При отладке ajax вдруг стала происходить странная ошибка в коде вызова ScriptMethod-а отдельно выделенного ScriptService,
в частности я дебажил некоторый модуль .ascx, в котором происходит обращение к объекту-прокси, созданному на стороне клиента:
код на стороне клиента js:

Sys.Debug.fail('');
if (typeof(siStatuses) != "undefined" && siStatuses != null)
{
WS.Scripts.ScriptService.CheckStockImagesDownloading(siStatuses, OnCheckComplete, OnCheckFailed);
}


при обращении происходил exception на стороне клиента вида:
The system cannot locate the resource specified;

который возникал уже при самом последнем обращении к ядру передачи собственно сообщения в теле калбека, а именно
где то в коде:

Sys.Net.WebServiceProxy.invoke(servicePath, methodName, useGet, params, onSuccess, onFailure, userContext, this.get_timeout());

........
this._xmlHttpRequest.send(body);



путем логического осмысления :) пришел к выводу что длина сообщения, передаваемого в scriptMethod была
значительно больше чем килобайт, указанный собственно говоря через атрибут UseHttpGet:


[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]


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


[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = false)]




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

понедельник, июля 07, 2008

Верх насилия над собой (или как отпилить сук, на котором сидишь)

Разочарование ждет того, кто промахнется мышкой вместо properties на disable button в окне internet status, находясь в терминальной сессии...



ps: как минимум, общение с провайдером
pps: сразу хочется вспомнить хорошими словами всех юзабилистов windows


среда, июля 02, 2008

Frontier

Приготовьтесь к настоящему кошмару!



Давно уже не трогают фильмы такого рода, но данный фильм (граница), снятый Люком Бессоном, оставил свое впечатление от моря крови, бескомпромиссной жестокости, мелочей в деталях, осознания того, что есть или даже могут быть люди с другим мировозрением, образом жизни, прямо противопоставленным общепринятому и который для них является единственно возможнным и необходимым - все это есть фильм frontier...



Но самое большое впечатление произвел сонг от AWIM - Kill Me, в заставке я тот короткий фрагмент, который присутствовал, прокручивал раз 10 наверно, сегодня прослушал полный
на http://www.youtube.com/watch?v=2Ku9_etu9UU



Сам обхор фильма и комменты к нему можно посмотреть на кинопоиске

http://www.kinopoisk.ru/level/1/film/266142/





ps: текст песни сохраню хотя бы здесь:

Kill Me
By Awim



Loving your dream,
carrying your pain.
Watching me going
slowly to my grave.
Didn't know you,
didn't know you.
Sipping hatred in a
glass of milk.
Injecting fears in my
brittle little veins.
Didn't know you,
didn't know you.

Talking nonsense to me,
I wish i could believe.
Living me untended
so little left to give.

Kill me I'm a monster
you made me cruel but I'm
not a failure.
Kill me I'm a monster
I beg you now cause I'm
not a killer.
Heal me I'm a monster
You spill my blood cause I'm
just a dreamer.
Kill me I'm a monster
You made me cry it will
soon be over.
Kill me I'm a monster
You made me cruel but I'm
not a failure.
Kill me I'm a monster
You made me cry it will
soon be over.


Floating in your dream
driven by your aim.
Faking to be in
laughing at my pain.
laughing at my pain.

Needed just a ride
with a lovely maid.
Sifting trough your light
tearing me to shreds.
Blood's coming to my head.

Kill me I'm a monster
you made me cruel but I'm
not a failure.
Kill me I'm a monster
I beg you now cause I'm
not a killer.
Heal me I'm a monster
You spill my blood cause I'm
just a dreamer.
Kill me I'm a monster
You made me cry it will
soon be over.
Kill me I'm a monster
You made me cruel but I'm
not a failure.
Kill me I'm a monster
You made me cry it will
soon be over.