Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Microsoft SOAP Toolkit 3.0  (Прочитано 23232 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 13-09-2013 17:38 » 

подскажите, где можно найти и качнуть "Microsoft SOAP Toolkit 3.0"  ?  В упор не могу найти, а все ссылки, что находил - битые. Например, вот тут , в конце статьи одна из таких явных ссылок. Перехожу - а там нету ничего

http://www.rsdn.ru/article/xml/soap.xml
>>SOAP Toolkit 3.0 может быть найден здесь:
>>http://msdn.microsoft.com/downloads/default.asp?URL=/downloads/sample.asp?url=/msdn-files/027/001/948/msdncompositedoc.xml

--------------
можно, конечно, попробовать собрать SOAP вручную, но там в теге  <data>

(click to show)
<S:Body>
      <ns2:loadPolicy xmlns:ns2="http://ws.dkbm.rsa.com/">
         <ns2:attachment>
            <data>. ТУТ..

мне нужно прицепить файл , сжатый MTOM , алгоритм сжатия я тоже не могу найти. Везде просто упоминается, что это некий способ сжатия


(использовать собираюсь из VS9 , С++)
« Последнее редактирование: 13-09-2013 17:55 от Алексей++ » Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 13-09-2013 19:03 » 

Может и не нужно никакого сжатия? Оберни «<![CDATA[ ... ]]>», замени все «]]>» в файле на «]]]]>&gt;<![CDATA[».

UPD: кстати: http://www.theserverside.com/news/1363957/Sending-Attachments-with-SOAP
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 14-09-2013 04:55 » 

спасибо, Ром, попробую

Добавлено через 2 часа, 35 минут и 59 секунд:
а есть ли в stl алгоритмах метод для замены всех вхождений подстроки на другую подстроку ? Не нашёл, сделал так пока что

Код: (C++)
//тестовые наборы
//const UINT8 testfile_st[]="1234]1]>56789]1]>1";
//const UINT8 testfile_st[]="1234]]>56789]]>1";
//const UINT8 testfile_st[]="1234]]>56789]]>1]]>";
//const UINT8 testfile_st[]="]]>56789]]>1]]>";
//const UINT8 testfile_st[]="]]>56789]]>]]>";
//const UINT8 testfile_st[]="]>56789]]>1]]>";
const UINT8 testfile_st[]="]]>1234]]>56789]]>1]]>";
//файл для вставки
std::vector<UINT8> filecontent(testfile_st,testfile_st+sizeof(testfile_st)-sizeof(testfile_st[0]));

//что искать для замены
const UINT8 tofind_st[]="]]>";
const std::vector<UINT8> tofind(tofind_st,tofind_st+sizeof(tofind_st)-sizeof(tofind_st[0]));

//на что заменять
const UINT8 torepl_st[]="]]]]>&gt;<![CDATA[";
const std::vector<UINT8> torepl(torepl_st,torepl_st+sizeof(torepl_st)-sizeof(torepl_st[0]));

if(!filecontent.empty())
{
        std::vector<UINT8>::iterator beg=filecontent.begin();

        while(1)
        {
                std::vector<UINT8>::iterator itfound=std::search(beg,filecontent.end(),tofind.begin(),tofind.end());
                if(itfound==filecontent.end())break;
                UINT32 inx=itfound-filecontent.begin();

                //удаляем
                itfound=filecontent.erase(itfound,itfound+tofind.size());

                //вставляем замену
                filecontent.insert(itfound,torepl.begin(),torepl.end());

                beg=filecontent.begin()+inx+torepl.size();
                if(beg==filecontent.end())break;
        }
}
« Последнее редактирование: 14-09-2013 07:31 от Алексей1153 » Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 14-09-2013 09:21 » 

Алексей++, дак replace у string.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 14-09-2013 16:59 » 

Dimka, неа. http://msdn.microsoft.com/en-us/library/0b7cc0ss.aspx

заменяет указанную адресами подстроку на другую строку

Вот у MFC::CString метод Replace - да, именно заменяет все вхождения на новую строку
« Последнее редактирование: 14-09-2013 17:03 от Алексей++ » Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 14-09-2013 21:36 » 

Лёш, а текст большой? В смысле строка, в которой надо заменять. Если нет, то делай replace в цикле (см. MyReplace), но при больших размерах строки (> 1..2 MiB) и большом числе вхождений подстроки для замены будет работать медлено. Поэтому лучше самому "собирать" результат: часть до искомой подстроки + замена + часть после подстроки + ... и тд. Так получается сложная ф-я, но зато работает быстрее.
Код: (C++)
void MyReplace(string& content, const string& search, const string& replace)
{
        size_t pos = 0;
        while ((pos = content.find(search, pos)) != string::npos)
        {
                content.replace(pos, search.length(), replace);
                pos += replace.length();
        }
}

void MyReplaceQuick(string& content, const string& search, const string& replace)
{
        if(search.empty()) return;
        string wsRet;
        wsRet.reserve(content.length());
        size_t start_pos = 0, pos;
        while((pos = content.find(search, start_pos)) != string::npos)
        {
                wsRet += content.substr(start_pos, pos - start_pos);
                wsRet += replace;
                pos += search.length();
                start_pos = pos;
        }
        wsRet += content.substr(start_pos);
        content.swap(wsRet);
}
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 15-09-2013 05:46 » 

Джон, текст небольшой. Но я по второму варианту уже сделал. В запасники себе этот код сохранил, чтобы каждый раз не отлаживать ))
Записан

HandKot
Молодой специалист

ru
Offline Offline

« Ответ #7 : 16-09-2013 04:16 » 

Microsoft SOAP Toolkit 3.0
?
Записан

I Have Nine Lives You Have One Only
THINK!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 16-09-2013 16:45 » 

HandKot, во, спасибо за ссылку )

Добавлено через 1 день, 45 минут и 44 секунды:
а кто-нибудь может в чат или скайп придти помочь мне с HTTP разобраться - у меня совсем нет опыта с ним, я что-то явно не так расставляю. И сервис, естественно, не слушается Улыбаюсь
« Последнее редактирование: 17-09-2013 17:31 от Алексей1153 » Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 17-09-2013 17:46 » 

Алексей++, HTTP простой как валенок. А вот HTTP в SOAP Toolkit - это отдельная история. Давным давно участвовал я в проекте, где надо было на HTTP навесить окошко с progress bar процесса закачки файла. Всё сделал, а потом через неделю узнал, что этим не может воспользоваться другая команда, так как оказывается, у них там файл передавался какими-то лимитированными по объёму сообщениями по 2 Кб, и на каждое из них создавалось отдельное HTTP-соединение. И до применения моего прогресса они об этом даже не подозревали - там внутрях всё само так делалось. Это в порядке анекдота про SOAP Toolkit 3.0 Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 17-09-2013 17:56 » 

я пока что без тулкита обошёлся - там всё уж больно страшно Отлично

я сделал через МФСишные  CInternetSession/CHttpConnection/CHttpFile

но я явно чего-то не догоняю - именно в работе с методами POST и GET у класса CHttpFile.  Либов самом формате SOAP, хотя с заказчиком его вид вроде разобрали

Добавлено через 2 минуты и 49 секунд:
всё осложняется тем, что на сам сервис зак повлиять не может, может только показать примеры, как он пробовал общаться с сервисом из 1C . Никаких логов не ведётся тоже,как я понял

Добавлено через 1 минуту и 14 секунд:
завтра днём я был бы рад помощи в скайпе. Там наверняка какая-то фигулька, которую я по незнанию не учитываю
« Последнее редактирование: 17-09-2013 18:01 от Алексей1153 » Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 17-09-2013 18:14 » 

Алексей++, увы, кроме этого случая 8 лет назад больше я с ним дела не имел, и не помню уже ничего.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 17-09-2013 18:20 » 

Код: (C++)
//std::string soap_utf8_1;
//...заполняется пакет SOAP

               
//отправка

if(!soap_utf8_1.empty())
{
        CInternetSession IConn;

        CHttpConnection* HTTPConn=0;
        try
        {
                HTTPConn=IConn.GetHttpConnection(
                        _address.c_str()
                        ,wcstoul(_port.c_str(),0,10)
                        ,_username.c_str()
                        ,_password.c_str()
                        );
        }
        catch(CInternetException* e)
        {
                HTTPConn=0;
                e->Delete();
        }

        if(HTTPConn)
        {
                //POST
                if(CHttpFile* httpfile=HTTPConn->OpenRequest(CHttpConnection::HTTP_VERB_POST,_addressWS.c_str()))
                {

                        BOOL bSendRequest=0;
                        try
                        {
                                bSendRequest=httpfile->SendRequest(0,0,&soap_utf8_1[0],soap_utf8_1.size());
                        }
                        catch(CInternetException* e)
                        {
                                e->Delete();
                        }

                        try
                        {
                                httpfile->Close();
                        }
                        catch(CInternetException* e)
                        {
                                e->Delete();
                        }
                       
                        httpfile=0;
                }


                //GET
                if(CHttpFile* httpfile=HTTPConn->OpenRequest(CHttpConnection::HTTP_VERB_GET,_addressWS.c_str()))
                {

                        BOOL bSendRequest=0;
                        try
                        {
                                bSendRequest=httpfile->SendRequest(0,0,0,0);
                        }
                        catch(CInternetException* e)
                        {
                                //HTTPConn=0;
                                e->Delete();
                        }

                        CStringW rs;
                        std::string answer_utf8;

                        if(httpfile->ReadString(rs))
                        {
                                if(!rs.IsEmpty())
                                {
                                        const char* p_utf8=(const char*)rs.GetBuffer();
                                        UINT32 len_utf8=rs.GetLength()*sizeof(rs[0]);
                                        answer_utf8.assign(p_utf8,p_utf8+len_utf8);
                                }
                        }

                        //прочитано:

                        //<soap:Envelope><soap:Body><soap:Fault><faultcode>soap:Server</faultcode>
                        //<faultstring>No such operation:
                        //(HTTP GET PATH_INFO: /dkbm-ws-1.0/services/policyLossService)
                        //</faultstring></soap:Fault></soap:Body></soap:Envelope>

                        try
                        {
                                httpfile->Close();
                        }
                        catch(CInternetException* e)
                        {
                                e->Delete();
                        }
                       
                        httpfile=0;
                }

                //--------------
                HTTPConn->Close();
        }

        //--------------
        IConn.Close();
}

и все этапы проходят, казалось бы, удачно. Но прочитанное GET (в комментарии показано) говорит, что что-то не так

Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 17-09-2013 18:22 » 

особые сомнения вызывает место
Код:
httpfile->SendRequest(0,0,&soap_utf8_1[0],soap_utf8_1.size());

описание функции
http://msdn.microsoft.com/en-us/library/2xfbsd16(v=vs.90).aspx

что за заголовки ? Что там должно быть вместо "0,0" у меня ?

Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 17-09-2013 19:58 » 

Алексей++, а ты namespaces сервиса настроил?

Добавлено через 8 минут и 10 секунд:
Цитата: Алексей++
что за заголовки ?
HTTP заголовки стандартные. Как минимум host и content-length. См. стандарт HTTP.
http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2
и для запроса
http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.3
« Последнее редактирование: 17-09-2013 20:06 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 07-10-2013 17:13 » 

всем спасибо за помощь, разобрался я таки  (по крайней мере на данном этапе) Улыбаюсь

Вопрос следующий:

как boundary может гарантировать, что он (boundary) не попадётся где-то в теле http или самого аттача в частности ?

ведь я парсю ответ, отыскивая первый boundary, затем следующий и тд.
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 07-10-2013 17:59 » 

Никак. Чисто статистически он попасться может крайне редко. Для 100% гарантии надо просканировать части http на его отсутствие.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 08-10-2013 10:41 » 

ок
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines