Проблема сопоставления URI BizTalk WCF-WebHttp с экранированной переменной - PullRequest
1 голос
/ 13 мая 2019

Я пытаюсь использовать адаптер BizTak WCF-WebHttp для отправки в Service Desk Plus CMDB API с помощью сопоставления переменных.

При попытке использовать браузер работает нормально.Для API Service Desk Plus CMDB требуется такой URI (строго сокращенный для удобства чтения):

http://host.com/api/cmdb/ci?OPERATION_NAME=read&TECHNICIAN_KEY=Mykey&format=XML&INPUT_DATA=<?xml version='1.0'?>
<API>
    <name>email@host.com</name>
</API>

Я использовал URI http://host.com/api/cmdb/ci и сопоставление URL.

<BtsHttpUrlMapping>
    <Operation Url="?OPERATION_NAME=read&amp;TECHNICIAN_KEY=MyKey&amp;format=XML&amp;INPUT_DATA=&lt;?xml version=&apos;1.0&apos;?&gt;
        &lt;API&gt;
            &lt;name&gt;email@host.com&lt;/name&gt;
        &lt;/API&gt;"/>  
</BtsHttpUrlMapping>

Этоработает отлично, но мне нужен более динамичный подход.Я попытался использовать сопоставление переменных, поэтому заменил жестко закодированный адрес электронной почты на переменную.

<BtsHttpUrlMapping>
    <Operation Url="?OPERATION_NAME=read&amp;TECHNICIAN_KEY=MyKey&amp;format=XML&amp;INPUT_DATA=&lt;?xml version=&apos;1.0&apos;?&gt;
        &lt;API&gt;
            &lt;name&gt;{email}&lt;/name&gt;
        &lt;/API&gt;"/>  
</BtsHttpUrlMapping>

При попытке сохранить сопоставление URL-адресов с переменной я получаю сообщение об ошибке.

WCF-WebHttpСвойства транспорта

Ошибка сохранения свойств.(System.InvalidOperationException) UriTemplate

?OPERATION_NAME=read&TECHNICIAN_KEY=MyKey&format=XML&INPUT_DATA=<?xml version='1.0'?><API><name>{email}</name></API>

недопустим;каждая часть строки запроса должна иметь форму «имя = значение», когда значение не может быть составным сегментом.См. Документацию для UriTemplate для получения более подробной информации.

Если я попробую переменную, которая не находится внутри экранированной строки XML, как с ключом, то она будет работать нормально.

<BtsHttpUrlMapping>
    <Operation Url="?OPERATION_NAME=read&amp;TECHNICIAN_KEY={key}&amp;format=XML&amp;INPUT_DATA=&lt;?xml version=&apos;1.0&apos;?&gt;
        &lt;API&gt;
            &lt;value&gt;email@host.com&lt;/value&gt;
        &lt;/API&gt;"/>  
</BtsHttpUrlMapping>

Мое намерениедолжен иметь возможность использовать переменную в экранированной XML-строке.Если это невозможно;Мне придется обратиться к динамическому адаптеру и создать сопоставление URI и URL в оркестровке.

1 Ответ

0 голосов
/ 19 мая 2019

Понимаете ли вы, почему он говорит , что каждая часть строки запроса должна иметь форму 'name = value ? Есть только несколько способов заставить работать UriTemplates.

Посмотрите, как работает UriTemplate здесь . Вот пример, который действителен:

  • погода / {состояние} / {город}? Прогноз = {день}

Так что в вашем случае вы должны сделать все после INPUT_DATA = переменной. Что означает всю экранированную XML-строку, о которой вы говорили.

...