Sunghwa Jin огласил прекрасный список того, почему DestinationParty resolution may fail. Особенно обращает на себя внимание ответ на его пост от Amando Resendez. By default, as far as I remember, both BizTalk hosts run at account - e.g. without domain name. Never mentioned in documentation, hovewer, it's so critical - to run both IIS app pool thru which HTTP receive location will authenticate incoming requests and BTS IsolatedHost. Secondly, I forget this completely (because SSO?) - HTTP send port must use authentication for outgoing requests as well. By default it is configured to use anonymous. Although this happens after DestinationParty is actually resolved, it is also important.
Put attention : authentication trusted flag on BTS host means that MessageBox will adopt the messages not only from the account that runs such a host.
P.S. Some configuration details, for example:
HTTP receive location URI - /PBossReceive/BTSHTTPReceive.dll?PBoss (and receive port must require authentication.
HTTP Send port URI (for partner inbox) - http://<servername>:8080/StsWebReceive/default.aspx?PartnerId=PBoss&FolderType=MessagesInbox (and use Kerberos autnetication)
Is that a good idea to publish (edited by Dan alongside) some addendums to .NET Essentials. I'd call this collection like ".NET Essentails. Simplified". One of the articles to compile is this one by Jan Seda on strong names. Thanks, Jan.
7 application blocks (now called Enterprise Library) still fight against log4net. Besides the winner, both seem to be good for BTS instrumentation. More technical oversight may be found here. Also for instrumentation, worth to consider Paul Bunyan.
DestinationParty property is used to resolve the send port within the RoleLink. Once DestinationParty is initialized, the orchestration looks back (thru bts_Party and bts_party_sendport tables in Management DB) for the associated send ports for desired operation. Therefore, the question of interest is how to initialize DestinationParty?
Generally, it depends on the initiating role of the RoleLink.
If the role stated for initiating is an implements role (thus, the orchestration receives messages thru this role), the DestinationParty property is initialized automatically by receive. Such an initialization occurs as follows:
· involved uses role is determined from RoleLink,
· its enlisted party is determined from configuration settings,
· its PartyID inserted into DestinationParty property.
From here the orchestration resolves the send port as mentioned below.
If the role stated for initiating is a consumer or uses role (thus, the orchestration send messages thru this role), the DestinationParty property must be initialized explicitly in the orchestration:
ConfirmOrder(Microsoft.XLANGs.BaseTypes.DestinationParty) =
new Microsoft.XLANGs.BaseTypes.Party(<value>, <qualifier> );
В прошлый раз я упомянул, что Receive Adapter должен уметь[1] выставить "WindowsUser" property, если его попросят. Осталось разобраться в том, как его "попросить". Во-первых, понятно, что не каждый адаптер умеет провести authetication. Что может значить authentication для, например, File Adapter, когда файл, в котором находится message, попал в receive folder простым xcopy? С другой стороны, адаптер, который умеет проводить authentication (HTTP Adapter, например) и "просить" об этом не надо - пусть себе всегда его и проводит, кому это мешает? Т.е. единственная возможность "попросить" адаптер произвести authentication это потребовать, чтобы, соответствуюший в pipeline, ResolveParty component взаимодействовал с некоторыми другими properties, кот. устанавливаются адаптером. А именно, для этого существует context prperty - AuthenticationRequiredOnReceivePort. ResolveParty component проверяет установлена ли она в false, и если false, неудача в попытке party resolution приводит только к тому, что BTS.WindowsUser и BTS.SourcePartyID остаются пустыми. Сам же передаётся дальше (например в orchestration). Если же AuthenticationRequiredOnReceivePort стоит на true, то неудача в party resolution, приводит к такой ошибке :
"There was a failure executing the receive pipeline: "Microsoft.BizTalk.DefaultPipelines.XMLReceive" Source: "Microsoft.BizTalk.Pipeline.Components" Receive Location: "D:okeyPrintDocIn*.xml" Reason: There was an authentication failure. "The party corresponding to the inbound message cannot be identified".
[1] Из адаптера, как и из pipeline, добраться до этого property довольно просто. Из - сложнее (say, possible) (запись от 4.4.05)
Party можно определить или через BizTalk Explorer или через BASSite. В обоих случаях будет использоваться ExplorerOM. Для party на этом этапе определяется alias. Для BASSite (Create Partner Profile) это выглядит, как выбор Property Name Qualifier из списка, заранее имеющегося в InfoPath. Важнейший qualifier из этого списка - "WindowsUser". Для BizTalk Explorer это выглядит почти также только с той разницей, что здесь вместо слова property используется именно alias и выбор производится не по и выбор производится не из списка qualifiers, а из списка имен (Names). Для "WindowsUser" его Name будет -"Windows User" (с пробелом). Value связет alias с реальным миром. Здесь может быть указан любой член группы 'BizTalk BAS Users'.
После того, как party определен, он сможет быть определен с помощью PartyResolition pipeline component. Если не рассматривать определение party по certificate, этот процесс происходит так: Receive Adapter, если указано, должен уметь провести authentication и поместить в message context propery "BTS.WindowsUser" (не путать с alias qualifier!). ResolveParty pipeline component ищет в Confoguration Database party, соответствующему этому property. (ResolveParty component включен и в XMLReceive pipeline) Если party найден, в orchestartion попадет message, в котором будут установлены следующие context properties : 1). PartyName (http://schemas.microsoft.com/BizTalk/2003/messagetracking-properties - MessageTracking.PartyName), 2) SourcePartyID (http://schemas.microsoft.com/BizTalk/2003/system-properties - BTS.SourcePartyID). Обе properties - not promoted, т.е. доступны из orchestartion как msg(MessageTracking.PartyName) и msg(BTS.SourcePartyID). Относительно OriginatorPID, то этот будет выставлен только если ResolveParty pipeline component призводит resolution by certificate. Во всех остальных случаях OriginatorPID будет stamped with "s-1-5-7", which is the SID of an anonymous user.
Итак, на этом этапе мы умеем определять party, использовать HTTP Adapter в сочетании с IIS для выставления в получаемых messages - "WindowsUser", использовать XMLReceive pipeline для party resolition и наконец, получить context properties - PartyName и SourcePartyID - из orchestartion. Не так уж и мало для одного выходного, да еще и под победную ничью с Ирландией 1:1.
stsadm вообще может быть с успехом использована клавиатурой во всех случаях, где мышкой используется Central Administration. В частности, и для path exclusion : если вы не хотите, чтобы SPS ISAPI filter (stsfltr.dll) перехватывал обращения к какой-то директории, пишите
stsadm -o addpath -type exclusion -url http://<server> и т.д.
(Заметки к вопросу о том, как работает моя психика)
За давностью лет это было довольно сложно вспомнить, но вычитая детали, осталась в моем памяти такая история : какое-то полу-официальное израильское издательство [1] еще в начале перестройки, когда еврейские массы двинулись на юг, издало новый, на них расчитанный перевод Торы. Перевод был "синхронный", т.е. на одной странице давался текст на иврите, а на ее развороте - русский перевод. Что это был за перевод, нам позволяет судить количество букв "Ы" и "Э" в русском тексте. Мошэ, Йосэф, Пыдуэль были героями той книги. Йырушалаим, Бэйт-Эль - местами действия. Мое первое знакомство с Торой было связано именно с этим переводом. По нему я должен был если не понять, то усвоить один из первых методических постулатов ортодоксии - к написанному в этом тексте не прибавляется ни то, чтобы буква, но и призношение может тебя обличить в неверном толковании прочитанного. Если сказано, например, что сыны Исраэля поселились в Мицраиме - так тому и быть : никакого Израиля и Египта там даже не упоминается. Забудьте о том, что вы когда-то, может быть, читали на эту тему - перевод создан по благославлению таких лиц, рядом с именем которых одно перечисление их заслуг занимает не меньше двух строк. Со знаками препинания там была отдельная проблема. Я легко себе представляю, сколько бород и усов было пожёвано в поисках ответа на вопрос, какого же хрена в русском языке развелось столько запятых и даже не в том дело, что нам, мудрым, с ними делать, а в том, когда же эти несчастные евреи из СССР освоят великий иврит. Дальнейшая мысль мудрых непременно останавливалась на праведности совершаемого труда, и с тяжелым сердцем, но умиротворенные, ставили они запятые там под частые вздохи. Из остальных знаков препинания следует особенно выделить восклицательный знак. Почему-то мне думается, что он как-то просто не пришелся по вкусу переводчикам. Например, "И сказал Бог: "Да будет свет" ". Ставить восклицательный знак? Никаких указаний мудрые переводчики не получали на этот счет, а заглянуть в другие переводы означало, практически, лишиться своего доброго имени. Так и не поставили. [2]
Самой Торе синтаксис, кстати, вообще, не понадобился. Верхние огласовки - тема отдельного поста.
Вернемся, однако, к буквам "Ы" и "Э". Только представьте себе, что вы изо дня в день, из недели в неделю читаете русский текст, в котором превалируют эти быквы. К месту и не к месту. В именах собственных и в словах, для которых мудрые не нашли достойных аналогов. Возможны две реакции : один человек, почитав это, скажет "Я проникся. Действительно, если оригинальное звучание слова передается лучше через Э, то, знать, не доходило это просто до тех, кто корпел над переводами пятикнижия до сих пор. В нашем же поколении удалось, наконец, проникнуть в самую сущность толкования писания - все пишем Пэтах-Тыква, а слова Мелабес и знать не знаем". Так родилось в Израиле то передовое движение религиозной интеллигенции (простите за каламбур), которое не только за пару лет освоило единственно правильное звучание библейских терминов, но и само поднаторело в передаче узнанного другим членам паствы.
Я был, однако, среди других читателей. Я даже заметил во втором издании упомянутого перевода что-то вроде намека на извинения перед читателем. В предисловии ко второму изданию говорилось, что-таки да, русскому глазу не привычно видеть такое количество "Ы" на одной старнице. Верховные указания были получены - ошибки исправлены, переизданный текст приглажен. Со мной же это сыграло злую шутку - я стал бояться "Ы". Даже не отдавая себе в этом отчет, я как-бы интуитивно стал избегать "Ы" в своем письме. Например, "подглядывал" или "подглядовал"? Есть, конечно, правило в русском языке, соглaсно которому глаголы, суффиксы -ива и -ыва сохраняются во множественном числе, если так пишется глагол в форме первого лица единственного числа. Т.е. правильно "подглядывал", потому что "подглядываю", но даже если бы я помнил это правило головой, моя психика, как отражение мною пережитого, не дала бы мне написать правильно.
Вывод : интуицию можно переубедить; верой, увлечением, рвением, в конце концов. Интуиция не дается нам a-priori. Это вопрос воспитания и стиля жизни.
[1] Как оказалось после проверки, это было "מוסד הרב קוק"
[2] А прямой речи я не то что в этом месте, но и во всей книге не нашел.
[показать]
[показать]Нам осталось разобраться с application adapters и с разными типами hosted applications. Как я уже говорил, основной предмет здесь - IHostedApplication interface, its implementations and uncessors.
Для начала разберемся, как установить разрабатывемое приложение в CCF. Нам понадобится initialization string, кот., в свою очередь, зависит от типа hosted application (defined in Microsoft.NSP.ContactCenter namespace in HostedApplication.dll )
public enum ApplicationType{ // Fields DisabledApplication = -1, ExternalApplication = 2, WebApplication = 1, WinFormApplication = 0}<
initstring></
initstring>Workflow's definitions are presented in three tables of ContactCenterAIF DB : 1) все определённые workflows даются в таблице WorkflowsMaster, все определённые шаги (steps) даются в таблице WorkflowStepsMaster, связь между ними, т.е. из каких шагов состоит какой workflow, дается в таблице WorkflowStepMap. Наконец, каждый шаг связан с одной и только одной application через ту же таблицу WorkflowStepsMaster (ксати, что делает непонятным, зачем вообще понадобились steps) .
For example, (assuming clear installation) the following query outputs all hosted applications that intended to run from workflow 1:
select wsmas.StepID, wsmas.Name as 'Step Name',sequence, apps.ApplicationId, apps.Name
from WorkflowStepMap as wsm
left join WorkflowStepsMaster as wsmas on wsm.stepid = wsmas.StepID
left join Application as apps on apps.ApplicationId = wsmas.ApplicationId
where workflowid = 1
order by sequence asc
Output:
StepID StepName sequence ApplicationId Name
1 Account 0 6 Accounts
2 Cell Coverage 1 8 Cell Coverage
3 External App 2 7 StandaloneTestApp
(3 row(s) affected)
Таким образом мы нашли, что workflow 1 состоит из 3-х шагов, которые будут исполняться в указанной (according to sequence column) последовательности и на каждом шаге будет исполняться соответствующая application. Каждый шаг представлен в Agent Desktop своим именем - StepName column.
Какие workflows доступны для какого агента, решаеется с помошью таблицы AgentWorkflowACL.
Дальнейший план такой :
1). Каждая hosted application имеет свой initialization string в своей строчке таблицы Application. В зависимости от типа приложения он несколько меняет форму, но главное в том, что для каждой application, соотвеветствующей исполняемому из workflow шагу, AgentDesktop из нее может узнать во-первых, где найти hosed application и где выводить ее UI. Понятно, что от самой hosted application требуется поддержка некоторого протокола, согласно которому AgentDesktop сможет с ней разговаривать. Таким протоколом является IHostedApplication interface и его реализация в классe HostedControl (в HostedApplication.dll assembly). Т.о. на этом шаге становится понятным как разрабатывать hosted appilcations - имплементируя IHostedApplication - и как установить разработанный assembly into AgentDesktop.
2). AzMan. Попытка выполнить workflow без предварительной кохфигурации AzMan, дает примерно такой результат :
Именно AzMan занимается управлением указанного здесь 'access to the hosted applications'. AzMan (в файле AzManCCF.xml) представляет собой Authorization Store. Введение в тему можно найти здесь. Непосредствено к нему обращается лишь ContactCenterAIF Web Service, в web.config которого и нужно внести путь к самому файлу
<
add key="AzManStore" value="msxml://C:InetpubwwwrootContactCenterAIFAzManCCF.xml
" />