Имя: Пароль:
1C
1С v8
HTTPСоединение - как получить код ответа 404? Выпадает исключение
,
0 romix
 
17.04.15
13:27
Для несуществующих ссылок всегда возвращает исключение.

        Соединение = Новый HTTPСоединение(Сервер,, Логин, Пароль);
        ответ=Соединение.Получить(АдресСсылки, имяВыходногоФайла);
        кодОтвета=ответ.КодСостояния;
        Если кодОтвета=404 Тогда
        КонецЕсли;    

Похожая тема:
v8: HTTPСоединение как получить код ответа
Там советуют использовать WinHttpRequest. Но может быть HTTPСоединение как-то можно заставить возвращать код 404?
1 Поpyчик-4
 
17.04.15
13:41
Попытка
        ответ=Соединение.Получить(АдресСсылки);
Исключение
КонецПопытки;
        кодОтвета=ответ.КодСостояния;
        Если кодОтвета=404 Тогда
                Сообщить("Атас!");
        КонецЕсли;
2 romix
 
17.04.15
16:24
(1) Этот код не работает:

ответ.КодСостояния    {(1)}: Значение не является значением объектного типа (КодСостояния)
3 oleg_km
 
17.04.15
16:48
Зачем заставлять возвращать код, если для этого разработчики решили использовать исключение? Используй исключение, у мелкомягких в .NET тоже вроде выскакивает исключение, если 400 или 500, и на Java вроде тоже. Так что 1С в майнстриме.
4 romix
 
17.04.15
17:50
(3) Я получаю статус документа, переданного в базу бухгалтерии (проведен, не проведен).

Если документ еще не передан (его нет в бух. базе), то 1С бухгалтерии возвращает 404.

Это штатный механизм OData от 1С.

Хочется различать ситуации, когда документа нет (штатные) и разные внештатные ситуации, на которые надо выдавать ужасное красное исключение.
5 ДенисЧ
 
17.04.15
17:56
в описании ошибки что указано?
6 oleg_km
 
17.04.15
20:27
Ну да, анализируй информацию из исключения
7 Serginio1
 
17.04.15
20:49
(3) Да в исключении ловят webResponse.StatusCode

for (int i=1; i < 1000; i++)
{
    string id = i.ToString();
    try
    {
         string url_source = get_url_source("http://mysite.com/"+id);
    }
    catch(WebException ex)
    {
        HttpWebResponse webResponse = (HttpWebResponse)ex.Response;          
        if (webResponse.StatusCode == HttpStatusCode.NotFound)
        {
            continue;
        }
        else
        {
            throw;
        }
    }

}
8 Serginio1
 
17.04.15
20:51
9 oleg_km
 
18.04.15
17:05
О, а надо в нашу обертку как-нибудь впихнуть, чтобы можно было получить объект Exception, через утиную типизацию приводить его к нужному типу, к WebException в данном случае
10 Serginio1
 
18.04.15
23:57
Можно сделать обертку для выполнения
(HttpWebResponse)request.GetResponse();
Но надо посмотреть как вообще исключения прикрутить
11 Serginio1
 
19.04.15
00:15
Можно сохранять в статической переменной исключение
12 oleg_km
 
19.04.15
00:17
Ну да. Я так и хотел
13 Serginio1
 
19.04.15
00:38
Но лучше сделать класс обертку внутри которого выполнять метод, где одним полем будет как раз поле ошибки.
14 romix
 
30.04.15
01:18
Так или иначе, а код ошибки то не получить никак - 1С прыгает в исключение, где поле с кодом уже недоступно.
Что-то содержащее 404 можно прочитать в тексте описания ошибки. Но это же придется пользователю вываливать, или текст парсить. Жалобу что ли им в поддержку напейсать...
15 Serginio1
 
28.05.15
11:28
(9) Сделал. Можно использоваь так. Чуть позже выложу

  врап=новый COMОбъект("NetObjectToIDispatch45");
     врап.ВыводитьСообщениеОбОшибке=ложь;
     NotFound=Врап.ПолучитьТип("System.Net.HttpStatusCode").NotFound;
       url="http://www.forum.mista.ru/";;
      
       попытка
       сообщить(Лев(ПолучитьДанныеССайта(врап,url),50));
       Исключение
        Ошибка=врап.ПоследняяОшибка;
         сообщить("Код ошибки "+Ошибка.Response.StatusCode);
       конецпопытки;

            сообщить("=====================");
       попытка
       сообщить(ПолучитьДанныеССайта(врап,url+"topic.php?rd=0025"));
       исключение
         Ошибка=врап.ПоследняяОшибка;
         сообщить("Код ошибки "+Ошибка.InnerException.Response.StatusCode.ToString());
         Сообщить(Ошибка.InnerException.Response.StatusCode.Equals(NotFound));
       конецпопытки
16 Dunemaster
 
28.05.15
12:00
(15) Ужас какой.
Достаточно использовать HTTPСоединение и в качестве аргумента методу Получить передать HTTPЗапрос (
17 oleg_km
 
28.05.15
12:09
(15) Там основная проблема когда сбрасывать свойство ПоследняяОшибка, потому что может быть уже непонятно к какому вызову оно относилось. И я это хотел вообще положить в AutoWrap, Invoke там же выполняется.

(16) Мальчик, проходи мимо. (шутка)
18 Serginio1
 
28.05.15
12:23
(17) Ну в попытке ты получишь только последнюю ошибку.
Посмотри http://files.rsdn.ru/19608/FilesForNetObjectToIDispatch.zip
19 Serginio1
 
28.05.15
12:25
Там такая реализация

public class AutoWrap : IReflect
    {
        public static bool ЭтоСемерка = false;
        public static bool ВыводитьСообщениеОбОшибке = true;
        public static Exception ПоследняяОшибка = null;

при исключении вызова метода

    if (ЭтоТип)
                    obj = T.InvokeMember(name, invokeAttr, binder, null, args, modifiers, culture, namedParameters);
                else
                    obj = T.InvokeMember(name, invokeAttr, binder, O, args, modifiers, culture, namedParameters);

            }
            catch (Exception e)
            {
                ПоследняяОшибка = e;
20 Serginio1
 
28.05.15
12:26
Ну и соответственно во врайпере

  public object ПоследняяОшибка
        {
            get{return new AutoWrap(AutoWrap.ПоследняяОшибка);}
        }
21 Serginio1
 
28.05.15
12:28
Да при исключении выбрасывается комовское исключение

   catch (Exception e)
            {
                ПоследняяОшибка = e;
                string Ошибка = "Ошибка в методе " + name + " " + e.Message + " " + e.Source;
  
                if (e.InnerException != null)
                    Ошибка = Ошибка + "\r\n" + e.InnerException.ToString();

                if (ВыводитьСообщениеОбОшибке)
                {
                MessageBox.Show(Ошибка);
                MessageBox.Show(e.StackTrace);
                MessageBox.Show(invokeAttr.ToString());
                }
                throw new COMException(Ошибка);
            }
22 Serginio1
 
28.05.15
12:30
(16) Я Ужаса никакого не вижу вот код

WebRequest=врап.ПолучитьТип("System.Net.WebRequest");
     request= WebRequest.Create(url);
    
       response = request.GetResponse();
       sr = Врап.СоздатьОбъект("System.IO.StreamReader",response.GetResponseStream());
        return sr.ReadToEnd();
23 oleg_km
 
28.05.15
14:32
(22) Для меня главное, что у NET - миллионы вопящих, топающих ногами и требующих немедленно исправить выявленные баги тестеров, а не то они уйдут на Java и пр. А у 1С горстка заложников системы разработки, которых вполуха слушают, а вообще пусть хавают что дают. Старший сам знает, что им надо.
24 Serginio1
 
28.05.15
14:56
(23) Если честно, то я удивляюсь тому, что через нетовские классы можно решить кучу задач, но народ будет делать все через задницу, чем применят эту обертку. Я сам довольно часто ей пользуюсь, в том числе и на семерке.
При этом я не могу понять, сейчас C# вообще что ли не изучают? Народ сразу на 1С начинает программировать?
25 oleg_km
 
28.05.15
15:57
(24) А очень мало на мой взгляд на 1С программистов. У нас сейчас работает молодой специалист, он имеет представление о программировании. До этого один бы радиоинженер, подключал интернет, понял что на 1С можно больше зарабатывать. Другой бросил институт и все эти абстракции и тоже кинулся денег зарабатывать. Они даже не заморачивались с повторным использованием кода, просто копипастили. Ну и откуда у них знание и желание изучать C#? Проще найти работу, где ничего этого не надо будет.
26 Serginio1
 
28.05.15
18:02
(25) Да уж