Ситуация: сайт размещен у хостера; сервис протестирован на ASP.NET Development Server'е; подключаем сервис к сайту и ... получаем сообщение об ошибке: "Server Error. An unhandled exception occurred during the execution of the current web request.
IIS specified authentication schemes 'IntegratedWindowsAuthentication, Basic, Anonymous', but the binding only supports specification of exactly one authentication scheme. Valid authentication schemes are Digest, Negotiate, NTLM, Basic, or Anonymous. Change the IIS settings so that only a single authentication scheme is used".
Проблема в том, что доступ к настройкам IIS ограничен.
Пытался найти workaround ... в итоге обратился к своему провайдеру - ORCSWEB, они среагировали практически сразу, несмотря на выходной прислали письмо, цитирую: "Please let me know if you would prefer Basic Authentication over Windows authentication and I will be happy to assist you".
Примечание: Basic Authentication - это аутентификации, при которой имя пользователя и пароль передаются серверу в открытом виде.
Показаны сообщения с ярлыком Feature. Показать все сообщения
Показаны сообщения с ярлыком Feature. Показать все сообщения
Could not load assembly System.Web.Abstractions
пятница, 24 апреля 2009 г.,
Ярлыки:
ASP.NET MVC,
Feature
При запуске ASP.NET MVC проекта (кажется после установки Code Contracts) получил сообщение:
Server Error in '/' Application. 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: Could not load file or assembly 'System.Web.Abstractions...'.
В web.config у System.Web.Abstractions обнаружил Version=0.0.0.0, а также System.Web.Mvc не оказалось на месте ... - мистика :)
В итоге, содержимое web.config заменил на взятое из нового проекта, и все заработало.
А еще не помешает: в контекстном меню Solution'а выбрать Clean Solution, и затем Rebuild Solution.
Server Error in '/' Application. 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: Could not load file or assembly 'System.Web.Abstractions...'.
В web.config у System.Web.Abstractions обнаружил Version=0.0.0.0, а также System.Web.Mvc не оказалось на месте ... - мистика :)
В итоге, содержимое web.config заменил на взятое из нового проекта, и все заработало.
А еще не помешает: в контекстном меню Solution'а выбрать Clean Solution, и затем Rebuild Solution.
Парсинг HTML'а
понедельник, 20 апреля 2009 г.,
Ярлыки:
веб-клиент,
Feature,
HTML,
mshtml
Парсить html, конечно, можно с помощью регулярных выражений (Regex), но ... например, требуется получить содержимое всех тегов, у которых атрибут id начинается с подчеркивания или заканчивается цифрой. При этом веб-сервер возвращает невалидный html, который постоянно меняется:
В такой ситуации использование регулярных выражений практически невозможно.
Решение: загрузить html в HtmlDocument.
С его помощью поставленная выше задача решается достаточно просто:
Для компиляции к проекту надо подключить сборки, которые входят в состав Microsoft Live Writer:
1) C:\Program Files\Windows Live\Writer\WindowsLive.Writer.Mshtml.dll;
2) C:\Program Files\Windows Live\Writer\WindowsLive.Writer.Interop.Mshtml.dll
Сборка C:\Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll не используется, потому что метод IMarkupServices.ParseString импортирован таким образом, что лишает возможности передать в него строку.
string html = |
<b id= |
</i> |
<i id= |
</i> |
<i id= |
</b>"; |
Решение: загрузить html в HtmlDocument.
public static IHTMLDocument2 Parse( |
{ |
HTMLDocumentClass doc = |
( |
MshtmlMarkupServices srv = |
var res = |
return res |
} |
IHTMLDocument2 doc = |
var linq = |
where tag |
select tag; |
foreach ( |
System |
1) C:\Program Files\Windows Live\Writer\WindowsLive.Writer.Mshtml.dll;
2) C:\Program Files\Windows Live\Writer\WindowsLive.Writer.Interop.Mshtml.dll
Сборка C:\Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll не используется, потому что метод IMarkupServices.ParseString импортирован таким образом, что лишает возможности передать в него строку.
Особенность CookieContainer'а
воскресенье, 19 апреля 2009 г.,
Ярлыки:
Feature,
Web Client
При первом обращении к веб-сайту, например, test.ru был получен ответ:
В HttpWebResponse.Cookies, а соответственно и в HttpWebRequest.CookieContainer окажется меньше cookie, чем указано в http-заголовках:
Два cookie: WwwDotTest и External - "пропали", т.е. не попали в контейнер. С External - понятно, это сторонний домен. А при повторном обращении к сайту:
Т.е. иногда лучше самому обрабатывать http-заголовки.
HTTP/1 |
Date: Thu, |
Set-Cookie: PathDotTest= |
Set-Cookie: PathTest= |
Set-Cookie: DotTest= |
Set-Cookie: WwwDotTest= |
Set-Cookie: Test= |
Set-Cookie: Path= |
Set-Cookie: Null= |
Set-Cookie: External= |
Location: /homepage |
Content-Length: 0 |
PathDotTest= |
PathTest= |
DotTest= |
Test= |
Path= |
Null= |
- адрес: http://test.ru; отправлены cookie: Path и Null.
- адрес: http://www.test.ru; отправлены cookie: PathDotTest, PathTest, DotTest, Test
- если в cookie указан domain=test.ru, то верни cookie при запросе http://test.ru;
- если в cookie указан domain=mail.test.ru, то верни cookie при запросе http://mail.test.ru;
- если в cookie указан domain=.test.ru, то верни cookie при запросе http://test.ru и любого поддомена, например, http://www.test.ru или http://mail.test.ru;
- если domain не указан, то это эквивалентно http://test.ru;
Т.е. иногда лучше самому обрабатывать http-заголовки.
Особенность HttpWebResponse.Headers
суббота, 18 апреля 2009 г.,
Ярлыки:
Feature,
HttpWebResponse,
WebHeaderCollection
HTTP-ответ - это обычный текст, в котором первая строка называется строкой состояния. Под ней могут быть указаны заголовки - строки с двоеточием. Оно делит строку на две части: слева - имя заголовка, а справа - его значение.
Тело сообщения отделяется от заголовков пустой строкой. Пример HTTP-ответа:
Для доступа к заголовкам используется свойство HttpWebResponse.Headers типа WebHeaderCollection. Так как WebHeaderCollection наследует NameValueCollection, то можно предположить, что поведение HttpWebResponse.Headers будет соответствующим.
Но, оказывается метод HttpWebResponse.Headers.GetValue(string) работает иначе.
Причина находится в методе WebHeaderCollection.GetValue(string), где происходит нарезка строки на части по каждой запятой. Поэтому получается неожиданный результат.
Тело сообщения отделяется от заголовков пустой строкой. Пример HTTP-ответа:
HTTP/1 |
Date: Thu, |
Set-Cookie: cname= |
Set-Cookie: cvalue= |
Content-Length: 9 |
Content-Type: text/html; charset= |
hello |
// пример использования NameValueCollection |
NameValueCollection col1 = |
col1 |
col1 |
col1 |
// в коллекции два ключа: key1 и key2 |
CollectionAssert |
// совпадают значения, |
var key1values = |
CollectionAssert |
CollectionAssert |
int index = |
var values1 = |
// [0]: "cname= |
// [1]: "cvalue= |
var values2 = |
// [0]: "cname= |
// [1]: "13-Apr-2010 23:43:04 GMT; path= |
// [2]: "cvalue= |
// [3]: "13-Apr-2010 23:43:04 GMT; path= |