GoFuckBiz.info
Форум успешных вебмастеров - GoFuckBiz.info
SEO · трафик · партнерские программы

   Форум успешных вебмастеров - GoFuckBiz.info > Бизнес-решения > Скрипты, программы и технические решения > кто с C# знаком подскажите плиз :)

Просмотр полной версии : кто с C# знаком подскажите плиз :)

14.10.2009, 13:49
MyName
собственно 1 приложение сделал тестирую...
следующая проблема вылезла:
в приложении используются HttpWebRequest и прочая сопутствующая хрень...

так вот локально все отработало несколько раз с большими нагрузками без каких либо проблем просто как часы...

а вот на хосте где тестирую в логе ошибки лезут о том что урл пустой... причем достаточно часто лезут..

параллельно работает там же другое приложение с использованием HttpWebRequest там таких ошибок отродясь не было... :? (то есть что-то на хостинге выключено вариант исключен)


союственно вопрос... никто с таким странным поведением не сталкивался? ошибок в коде не видать вроде :)
14.10.2009, 18:21
Philoet
Не совсем ясно по приложению. Оно с внешними ресами работает? Из дома все ок, а с сервака куй?
Пытался ручками с сервака достучаться до ресов?
В какой момент ошибка, во время GetResponse или во время создания WebRequest.Create?
Проснифить тем же фидлером не пробовал, что ресы в ответ на запросы кажут?
В общем маловато инфы, а так - про пустой урл не слышал вроде. Разве что он действительно пустой ибо должен получаться выдиранием с предыдущей полученной страницы, а в ней не было урлы (не достучались до реса или еще что).
И что означает фраза - часто лезут. Ты с одним ресом работаешь или с несколькими? Т.е. на одном и том же ресе то работают то не работают, или на разных?
15.10.2009, 07:16
MyName
Не совсем ясно по приложению. Оно с внешними ресами работает? Из дома все ок, а с сервака куй?

угу примерно так. Проблема возникает примерно в 10% запросов причем если идет вызов внешнего сайта в цикле сейчас почти сутки отпахало на запросах без цикла по 1 странице все чисто....

при этом на серваке работает второе схожее приложение там таких проблем нет.
Пытался ручками с сервака достучаться до ресов?
в 90% случаев приложение достукивается... рессы одни и теже. еслиб проблемма была с доступом то было 404 или ещё что-то а тут ошибка вываливается что типа я урл не передал HttpWebRequest'у O_o


В какой момент ошибка, во время GetResponse или во время создания WebRequest.Create?

пока по логу все чисто как повторить смогу скине полность ошибку так точно не помню... помоему всетки при креейте...

Проснифить тем же фидлером не пробовал, что ресы в ответ на запросы кажут?

на хостинге пока чекаю там полного доступа нет :( но 100% что там не 404 и т.п. в логе формируемом из эксепшенов было что урл пустой передаю...

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

там только в 1 месте урл выдирается... стоит 2 проверки. 1 полученли контент нужный вобще 2 естли урл в контенте. если 404 или ещё что выпало я тупо прогоняю запрос ещё раз но в 99.9999% случая нет там 404 при предыдущих запросах....

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

И что означает фраза - часто лезут. Ты с одним ресом работаешь или с несколькими? Т.е. на одном и том же ресе то работают то не работают, или на разных?

часто лезут - примерно 10% всех запросов. локально запускаю 0% гонял наверное часов 8 локально за все это время ни одной ошибки. Работаю с 3мя ресами 2 у меня на серваке (вобще сервак в другом месте стоит) 1 сторонний. Бан со стороны сторонего реса исключен это партнерка... + были бы другие ошибки тогда :)

спасибо :)

зы
ещё чутка поясню.

в методе где ошибка возникает идет 2 запроса и ещё несколько при вызове функций 1го моего класса.

1 формируется урл такого типа "http://kakoi-to-url"+"id-peredani-funkcii"
то есть тут ошибка исключена еслиб был косяк с передачей id функции осталсябы какой-то-урл :) при таком запросе ответ все равно не 404 идет просто нет контента.

от туда забираю в числе прочего 1 урл и там идет такая проверка

if (SCoverUrl != null && SCoverUrl !="")
{
.....
}

вобщем мистика :)

далее идет вызов функции ещё 1го класса он тоже веб запросы гоняет... если там ошибка была бы эксепшен выглядел бы по другому...
15.10.2009, 07:51
Philoet
Как я понимаю тебе вылетает что то вроде (в русском .NET фреймворке)
Необработанное исключение: System.UriFormatException: Недопустимый URI: URI пуст.
Собственно если это так - то даже не 99 а 100% что ты действительно пытаешься запихнуть в Create пустой урл. Если бы урл был кривой, а не пустой было бы что то вроде:
- Необработанное исключение: System.UriFormatException: Недопустимый URI: Невозможно определить формат URI.
- Необработанное исключение: System.UriFormatException: Недопустимый URI: Невозможно выполнить разбор имени хоста.

Т.е. надо все же отталкиваться от этого.
Кстати приложение не многопоточное случайно? Если да - то косяки могут самые неожиданные вылезти, в одном потоке присваиваешь урлу, в другом обнуляешь и в это время в первом потоке создается WebRequest с уже пустым урлом =)

Ну а вообще надо логировать конечно и смотреть по сорцам. Опыт показал, что как бы ты не верил, но чудес не бывает, бывают только косяки программера/админа )
15.10.2009, 08:02
MyName
ну да именно эта ошибка :)

да я сам в чудеса не верю :) любое подобное чудо - косяк тут согласен... была наивная мысль про то что в урле идет пробел и ещё какая-та хрень но ты её только что развеял :) как проверяю на пустой урл выше скинул... т.ч. хз странно что за ~8ч теста ошибка локально не вывалилась ни разу :( а на хосте за несколько минут можно поймать....
приложение кстати однопоточное больше там пока не требуется... работает как веб сервис. + проверка стоит больше 1го раза метод вызвать даже если очень захочется не получится... тупо файл создаю при вызове удаляю по завершению работы метода... пока файл есть метод вызвать нельзя...

зы
кстати по веб конфигу для винды никто проконсультировать не может? :)
интересует как настроить <httpRuntime
executionTimeout = "60000"
/> в папке тоесть тупо пример конфига :)

сейчас просто в корне лежит конфиг. если пытаюсь ещё 1 делать в папке с приложением этим.... хостинг начинает матерится по страшному... за рабочий пример конфига готов отблагодарить символической суммой на wmz кошелёк :) хотя вроде и тот что в корне валяется пашет для папки но на 100% не уверен.....
16.10.2009, 08:27
MyName
хы само лесть перестало... хз в чудеса не верю.... но в той части нефига не менял где ошибка выскакивала... :)

кстати никто не знает как можно "развернутую" инфу получить по ошибке? а то в 1м месте еэксепшен вылетает очень редко... в скомпилированной версии указывается тока название метода где он произощел.... а локально его достичь пока не удалось чтобы все переменные промониторить :(

смотрю так
ee.ToString()
где Exception ee

зы
уже не очень актуально... прозрел отрыл... но если кто-то подскажет на будуюеще буду очень благодарен :)
16.10.2009, 10:29
Philoet
Мдя, бывает, спишем на косяк админа ) Хотя кстати не понял причем тут файлы "тупо файл создаю при вызове удаляю по завершению работы метода... пока файл есть метод вызвать нельзя..."

Для того чтобы получить полную инфу по тому где и когда вылез Exception я вызываю обычно:
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);

Но чтобы получить StackTrace с номерами строк и прочьими радостяи необходимо чтобы рядом с exe лежал *.pdb файл полученный при компиляции проекта (по моему только в Debug версии компиляции, хотя точно не помню).
16.10.2009, 10:33
MyName
Philoet, про файлы просто защита от одновременного запуска метода 2 раза... при запуске метода файл делаю например "metodHelloWorldWork" в конце удаляю. соответственно в самом методе стоит проверка если файла нет то метод не будет работать... :) просто работаю с файлами если метод 2 раза вызвать может файл подгадить с данными :)

Но чтобы получить StackTrace с номерами строк и прочьими радостяи необходимо чтобы рядом с exe лежал *.pdb файл полученный при компиляции проекта (по моему только в Debug версии компиляции, хотя точно не помню).
спс я так понимаю в остутвии exe для веб сервиса надо попробовать сунуть это в корень или папку bin?
16.10.2009, 13:37
Philoet
Эмм.. Мне кажется лочить вызов метода созданием файла немного.. извращенно ) Если я правильно понимаю для чего ты это делаешь конечно, обычно опять таки данное действо делается для многопоточки, чтобы несколько методов в разных потоках не получили одновременный доступ к данным.
По идее для этого есть lock (советую почитать Рихтера - CLR via C#)
Пример:

public class SomeClass
{
private readonly object lockObject = new object();

public string DoSomething()
{
lock (lockObject)
{
...операторы
}
return null;
}
public string DoSomething2()
{
lock (lockObject)
{
...операторы
}
return null;
}

}

Таким образом если мы находимся в методе DoSomething и пытаемся вызвать DoSomething2 - выполнение кода остановится на строчке lock (lockObject) и не продолжит выполнение пока в методе DoSomething мы не выйдем за пределы кода

lock (lockObject)
{
...операторы
}

Или тот же метод вызывается разными запросами, и соответственно выполняется тот же код с разных инстансов? Тогда может и разумно, опять таки, в моих проектах всегда по 1й копии программа запускается, посему без надобности.

А по поводу pdb, честно говоря - я никогда не делал веб сервисы, как то без надобности было, я десктопные вещи разрабатываю, но гугль выдал следующее
http://stackoverflow.com/questions/381537/deploying-pdb-files-in-iis-any-benefit

Как я понимаю надо просто положить pdb в корень, проверь )
16.10.2009, 13:43
MyName
спс пока без ошибок пашет :) как что нить полезет попробую :)

по поводу извращения... ну у меня так над аваторкой и написанно быдлокодер :)

по поводу лок не сталкивался раньше и не уверен что он срабоатет...
веб сервис при вызове функций грубо говоря запускает новое приложение... это грубо говоря в деталях не разбирался но спокойно можно объявить1 глобальную переменную... вызвать 10 раз веб сервис и у каждого запущенного варианта можно использовать своё значение переменной (типа как запустить несколько раз дектопное приложение)... вот на случай одновременного запуская я так и делаю :)
16.10.2009, 13:52
Philoet
Понятно ) Ну тогда наверное лок тебе нафик не сдался, если на каждый запуск - отдельный instance. Интересно толкьо что будет если во время выполнение метода, он упадет и файл не будет удален, по идее следующий запуск функции подвиснет, ожидая удаления файла, если конечно удаление файла не вставлена куда нить в finally блок
16.10.2009, 14:01
MyName
если метод вываливается по эксепшену файл трется.
если метод вываливается по ребуту сервака например :) то останется.... (этого и подобных вариантов пока не попадалось)
16.10.2009, 14:10
Philoet
Пнятно, ну ладно, тады удачи с проектом )
16.10.2009, 14:13
MyName
спасибо. тебе тоже удачи в проектах :)

Работает на vBulletin® версия 3.8.6. Copyright ©2000-2011, Jelsoft Enterprises Ltd. Перевод: zCarot