Добрый день! Решил освоить интеграцию с bpmonline 7.4 через oData. Взял пример который был на вебинаре по разработке на 7.4 и он не работает.
А конкретнее не работают методы PUT и DELETE. То есть я могу удачно авторизироваться и создать запись. Но вот при попытке удалить или изменить получаю ошибку 405 (Недопустимый метод). Я так полагаю проблема где-то в настройках iis или config файле сайта. Подскажите пожалуйста что нужно настроить.
Нравится
Здравствуйте, Вячеслав!
Приведите, пожалуйста, пример кода, который не работает.
Необходимые компоненты сервера можно посмотреть в руководстве по установке, например тут:
http://www.training.terrasoft.ru/sites/default/files/BPMonline_Setup_Gu…
Код полностью взят из примера, который демонстрировался в вебинаре по 7,4.
static void UpdateRecord(string guid) { // Создание экземпляра запроса для изменения контакта с заданным идентификатором. var request = HttpWebRequest.Create(serverUri + "ContactCollection(guid'" + guid + "')") as HttpWebRequest; request.CookieContainer = bpmCookieContainer; // Для изменения записи используется метод PUT. request.Method = "PUT"; request.Accept = "application/atom+xml"; request.ContentType = "application/atom+xml;type=entry"; // Создание сообщения xml, содержащего данные об изменяемом объекте. var content = new XElement(dsmd + "properties", new XElement(ds + "Name", "New")); var entry = new XElement(atom + "entry", new XElement(atom + "content", new XAttribute("type", "application/xml"), content)); // Запись сообщения xml в поток запроса. using (var writer = XmlWriter.Create(request.GetRequestStream())) { entry.WriteTo(writer); } // Получение ответа от сервиса о результате выполнения операции. using (WebResponse response = request.GetResponse()) { Console.WriteLine("Данные контакта с идентификатором " + guid + " успешно обновлены."); } }
Метода PUT не существет. Надо использовать либо GET либо POST
Попробуйте подкорректировать конфигурационный файл (предварительно сохраните копию):
..\Terrasoft.WebApp\Web.config
Необходимо добавить 2 строчки в соответствующие блоки (system.webServer самый нижний):
<remove name="WebDAVModule" /> <remove name="WebDAV" />
<system.webServer> <httpErrors errorMode="Detailed" /> <validation validateIntegratedModeConfiguration="false" /> <modules> <remove name="WebDAVModule" /> <!--...--> </modules> <handlers> <remove name="WebDAV" /> <!--...--> </handlers> <!--...--> </system.webServer>
"Толмачев Дмитрий Юрьевич" написал:Необходимо добавить 2 строчки в соответствующие блоки (system.webServer самый нижний):
<remove name="WebDAVModule" />
<remove name="WebDAV" />
Огромное спасибо! Сразу заработало!
"Олейников Владимир Владимирович" написал:Метода PUT не существет. Надо использовать либо GET либо POST
http://academy.terrasoft.ru/documents/?product=SDK&ver=7.4.1
https://ru.wikipedia.org/wiki/HTTP#.D0.9C.D0.B5.D1.82.D0.BE.D0.B4.D1.8B
Есть ещё вопрос:
Как очистить справочное поле через метод PUT ?
Пробовал передавать Guid.Empty.ToString() выдает ошибку 500. null и пустая строка вызывают ошибку 400.
Поставить новый id - без проблем. А вот очистить не получается.
Попробуйте так:
XElement brandElement = new XElement(ds + "SmrBrandId"); brandElement.SetAttributeValue(dsmd + "null", true); var content = new XElement(dsmd + "properties", brandElement );
Но работает не со всеми полями. По моему зависит от обязательности заполнения и установки значений по умолчанию.
И снова я безмерно благодарен! Всё получилось. Справочное поле стало пустым.
Но появилась другая проблема.
Дело в том, что я пишу интеграцию с сервисом работающем на framework 2.0
Я взял всё тот-же проект из примера выставил в нем framework 2.0
xml сообщение я формирую через XmlDocument тут всё хорошо. Но в этом месте:
using (WebResponse response = request.GetResponse())
Скрипт как-бы зависает. То есть после него совсем ничего не происходит. Никаких ошибок, но и дальше скрипт не выполняется. Просто мертвая точка. И данные в bpm не заносятся.
При чем работает только с framework 4.0. Даже с framework 3.5 не работает.
Если, ничего не меняя в коде, выставить framework 4.0 то всё проходит успешно.
Подскажите, пожалуйста чего не хватает?
Здравствуйте, Вячеслав!
Судя по описанию тут та же проблема:
http://stackoverflow.com/questions/11319891/httpwebrequest-only-running…
Попробуйте посмотреть Fiddler'ом, есть ли разница в запросах.
Fiddler показал что запрос не отправляется в принципе. На авторизацию запрос проходит и удачно, а вот на изменение нет.
Погуглив более тщательно проблема была обнаружена. Дело всё в том что перед выполнение запроса нужно закрывать поток RequestStream. И вот framework 4.0 делает это самостоятельно перед выполнением функции GetResponse, а все фреймворки ниже не умеют этого. Поэтому перед
using (WebResponse response = request.GetResponse()) { /*---------*/ }
надо писать: request.GetRequestStream().Close()
И запрос должен выглядеть так:
request.GetRequestStream().Close(); using (WebResponse response = request.GetResponse()) { /*---------*/ }
И вот так всё работает.