• Авторизация


LDAP (not rant) 15-10-2004 05:15


LDAP - огромная тема. Вот только самые поверхностные сведения для повседневной работы.1). LDAP в Windows используется как один из провайдеров запросов ADSI к ActiveDirectory. Это протокол, сам по себе он не содержит никакой информации. Он использует TCP/IP обычно на порте 389.2). LDAP провайдер реализован в Windows в двух DLL - adsldp.dll, adsldpc.dll. Через CRW этот провайдер доступен из .NET. Сам ADSI имеет в .NET собственный namespace - System.DirectoryServices. ( В прошлом веке вместо этого использовали #include :) )3). Хотя LDAP провайдер входит в любую поставку Windows ( включая XP ), но это его клентская часть. LDAP сервер устанавливается как часть ActiveDirectory на DC (Domain Controller) из dcpromo.exe.4). Специально ( и только для этого! ) для работы с LDAP в System.DirectoryServices namespace определен об'ект DirectorySearcher. Поиск по запросу дается его методами FindOne() и FindAll().5). Запросы LDAP формулируются на языке похожем на Lisp. Некоторые подробности - см. здесь. В DirectorySearcher это property Filter. Запросы выражаются по отношению к об'ектам информационной модели LDAP, которые могут быть• class - "a category of objects that share a set of common characteristics"• attribute. ( Примеры attributes: Common Name - CN, Organizational Unit - OU, ObjectClass )В информационной модели LDAP attributes определяются отдельно от классов уже потому, что могут быть "приложены" к разным классам.Следующий код для поиска user по login name ( sAMAccountName attribute ) показывает все эти концепции вместе ( checks & try/catch are omitted for brevity ) DirectoryEntry _searchRoot = new DirectoryEntry(strLoginPath); DirectorySearcher searcher = new DirectorySearcher(_searchRoot); StringBuilder sb = new StringBuilder(); sb.AppendFormat("(&(objectClass=user)(sAMAccountName={0}))", strUserName); searcher.Filter = sb.ToString(); SearchResult sRes = searcher.FindOne(); DirectoryEntry de = sRes.GetDirectoryEntry(); PropertyValueCollection coll = user.Properties["displayName"]; _FullName = coll[0].ToString(); de.Close();Как видно из кода, _searchRoot получает параметром login path, кот, например, может выглядеть так DirectoryEntry _searchRoot = new DirectoryEntry("LDAP://domain_server:389");Для конкретного примера с поиском user, имя сервера как раз и есть часть login name. Как например, если login name - flexolegk, то сервер будет flex.Следует однако помнить, что не всегда такой сервер является DC, как в случае с local logon. В этом случае этот код будет работать, как клиентская часть, до FindOne(). Дальше произойдет exception.6). LDAP - это secured protocol. Для модификации элементов его модели требуется SSL connection. В этом случае порт меняется на 636. Для поиска требуется практически любой вид authentication:_searchRoot.AuthenticationType = AuthenticationTypes.Delegation;_searchRoot.Username = @"flexolegk";_searchRoot.Password = "123456";Если не дать этих строчек, будет использоваться current user. Лучше всегда указывать( особенно из aspx :) ) 19.11 -Хотя один администратор, послушав меня на эту тему заметил, что это просто бред, если нет SSL, указывать пользователя для authentication - поиск-то уж, по его словам, всегда разрешен всем. Проще, на его взгляд, какие-то поля скрывать, а не запрещать поиск юзерам.7). Терминология. DN - Distinguished Name - Entries are arranged in the directory information tree based on their Distinguished Name. The Distinguished Name consists of a series of Relative Distinguished Names and serves as a primary key for an object in the directory information tree. RDN - Relative Distinguished Name. Each component of the Distinguished Name is a Relative Distinguished Name. The Relative Distinguished Name is unique within its container, and is analogous to a file name or directory in a file system. The RDN consists of an attribute type and a valueExamples of RDNs are listed below, where OU stands for organizational unit:• cn=Oleg• ou= Development• dc= MicrosoftLDIF - LDAP Data Interchange Format - существует утилита LDIFDE.exe. Так это ее экспортимпорт формат.8). Обычно LDAP администрируют с помощью ADSI скриптов. Если какой администратор сподобится знать VBScript или JScript, то ADSI - это COM server.9). Я ее никогда в глаза не видел, но говорят, есть еще lpd.exe ( или во всяком случае, была под Win2K )
комментарии: 0 понравилось! вверх^ к полной версии
Access to SqlServer from SharePoint WebParts 06-10-2004 18:48


If you are developing custom web parts that need to connect to a SQL Server database to retrieve data, you may be confronted with the following error:

{"Request for the permission of type System.Data.SqlClient.SqlClientPermission, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 failed." }

This is due to SharePoint Portal Server and Windows SharePoint Services implementation of .NET Code Access Security (CAS). A solution that addresses the aforementioned error is cited below:

Locate and open the wss_minimaltrust.config file (NOTE: If you've gone with the default SharePoint or WSS install, this file is located at :Program FilesCommon FilesMicrosoft SharedServer Extensions60Config)

Add the following element to the SecurityClasses section of this config file:

<securityclass name="SqlClientPermission" description="System.Data.SqlClient.SqlClientPermission, System.Data,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"></securityclass>
In the PermissionSet section of this configuration file, add the following:
<ipermission class="SqlClientPermission" version="1" unrestricted="true"></ipermission>

If you still run into the error, try adding these settings to the wss_mediumtrust.config file.
Ну а еще проще - пишите в web.config "Full" вместо Mimimal или Medium. Можно, конечно, и в GAC WebPart внести, но только когда отладка закончена. :)
комментарии: 0 понравилось! вверх^ к полной версии

Это СС 01-10-2004 19:06


СС -SS - Schutzstaffel создавались как охраннные отряды нацисткой партии. Почти как советские внуренние войска. С 1929 года ими руководил Гиммлер, при котором СС полностью отделилось от СА ( после "Ночи длинных ножей" роль СА вообще стала очень незначительной ). В СС набирали через специальные школы - больше 30 таких школ для юношей и 4 - для девушек. Не в пример школам НКВД-МВД, они не чурались и релиозной сферы. Для выпускников этих школ создание после ее окончания арийской семьи было обязательно. Со временем, однако, СС потеряло свое лицо, как чисто арийская организация. Боевые отряды СС включали в разное время венгерскую кавалерийскую дивизию, французскую дивизию "Шарлемань", мусульманскую дивизию "Хандшар", голландскую -"Ландсторм-Нидерланд", албанскую - "Скандербег", 3 казацкие дивизии СС русских и украинцев, болгарский батальон,2 латышские дивизии и др.
В ведении СС находились почти все концентационные лагеря.
СС (включая ваффен-СС) признана преступной организаций на Нюрнбергском процессе, впоследствии это неоднократно почеркивалось ООН.


[показать]
Русские казаки в рядах Ваффен-СС


Гиммлер также руководил (как частью СС) СД - Sicherheitsdienst - службой безопастности. рейха. В теории, СД должен был заниматься исключительно внутренней разведкой и слежкой, практические же меры - принимать гестапо. В жизни, однако, функции обоих тесно перелетались: гестапо имело свою картотеку, агентуру и т.д. IV B отдел гестапо - сектор IV B 4, возглавляемый Адольфом Эйхманом, занимался "окончательным решением" еврейского вопроса, oтдел IV E - контрразведкой. Цифра IV означает принадлежность к четвертому управлению имперского управления безопастности (РСХА). Обе организации - СД и гестапо - были признаны на Нюрнбергком процессе преступными, их главные руководители - расстреляны или приговорены к различным срокам заключения.


комментарии: 0 понравилось! вверх^ к полной версии
Chanson d’automne 30-09-2004 04:51


Quotation of week
Фельдмаршал фон Рундштедт - верховный главнокомандующий немецкими войсками на западе(отстранен Гитлером 2 июля, на его место был назначен фон Клюге ):
"Не станет же генерал Эйзенхауэр объявлять о наступлении в передачач Би-би-си?" Просто не поверили. Отрывок из Верлена - смешно!
комментарии: 0 понравилось! вверх^ к полной версии
Йом Кипур. Чем хорошо пассивное участие в молитвах? 26-09-2004 04:10


Я бы искренне желал счастья и успехов всему дому Израиля. И не только Израиля. Но в такой день - именно Израиля. С другой стороны, ну не убедили меня как-то до сих пор ни книги почтенного р.Кука, ни разговоры о כנסת ישראל.
Неубежденный, поэтому, я не стану за всех просить. И не хотел бы, чтобы за меня просили другие. Лучше я просто в сторонке постою. С опозданием даже.
Если сегодня небо и ближе, чем обычно, то почему оно меня так не манит? А псалмов всего 150. Поскольку 151-й уже написан http://www.paul.pp.ru/aquarium/sestra_07.html мне осталось просто сказать "Спасибо, Господи". Спасибо, что стал я свидетелем славных дел твоих, свидетелем дел детей твоих, а также свидетелем их мерзостей. Все это жизнь. Я рад, что живу в этом мире. Вот если бы только ты сподобился послать мне немножко любви. Моего счастья в этом мире. Лично моего. Не такой уж я плохой,- ты посмотри сверху. Я только не умею молиться по команде. И могу проспать נעילה. Прости, Господи - у них глаза такие все одинаковые. Глаза моего народа.
А главное - пошли счастья Еве. Она, наверное, лучше меня понимает, что это такое. Ты вразуми ее - я буду у нее учиться.
комментарии: 1 понравилось! вверх^ к полной версии
MS Reporting Services - first impression 25-09-2004 17:52


Так подумать, действительно у MS до сих пор не было своего собственного продукта для создания reports. Тем более странно, что CrystalReports давно стал синонимом тупика. Настолькo тупика, что ссли бы меня спросили месяца 3 тому, как быстрее и проще сделать reports для Web, я бы почти наверняка сказал бы - обычный asp.net. И в выборе data provider ты не ограничен, и layout - весь в твоих руках. Время разработки осталось? Кодируйте быстрее!
Но вот появились Reporting Services - жизнь изменилась. Относительно data providers, то наконец, разрабочик report стал полноценным членом ассоциации Web developers: ado.net и для него стал родным и близким.Кстати заметим, что ADO.NET , конечно, включает и OLAP для Web based reports (aх, Crystal, ну впрямь тупик).
Layout - вообще для reports не совсем адекватно воспринимается Web-разработчиком. Report layout - это не совсем таблица,вернее разработчикам Reporting Services представляется, что в случае с reports, он проще и нет необходимости давать разработчику возмость доступа к коду самой страницы. Только design. Кодом report называют новый, XML-based язык - RDL: Report Definition Language. Как он обрабатывается в конечном итоге показываемую старницу - "тайна" одной из главных компонент RS - Report Processor. Он, в свою очередь, - часть Report Server: набор core-components, которые как за первичную обработку RDL, так и за практически всю остальную функциаональность продукта по части scheduling, delivery, delivery extension, rendering extension, data processing-extension etc.
Все эти компоненты вместе образуют "слой", называемым в документации Report Server. Его задача - получив RDL на входе, обработать его (с помощью толькo что перечисленных служб) в HTML или , в общем, в то, что будет указано в Rendering Extension.
Еще один "слой" продукта образует Report Manager. Он отвечает за конфигурацию reports: subscriptions, report parameters, secured access etc.
RS Components Access
Report Manger - это Web application,по умолчанию расположенная в ..Program FilesMicrosoft SQL ServerMSSQLReporting ServicesReport Manager. Она предоставляет UI , с помощью которого и осуществляются соответствующие операции конфигурирования. Default installation makes it with web alias - Reports, т.е. доступ к Report Manager, обычно, такой:
http://server/Reports
(Кстати, по каким-то непонятным причинам, в Report Manager Web application отсутствует default.xxx страница. Вместо этого, default installation конфигурирует IIS на home.aspx по умолчанию.)
Report Server - это Web-service с достаточно широким набором методов. Доступ к нему, может быть осуществлен или напрямую через URL, или через Web-reference. Во втором случае, это достаточно тривиально: методы, как методы, параметры не сложные. Как и ожидалось, используется SOAP. Вызывайте, но только никакого метода, похожего на GenerateReport(), там не найдется. А если бы и нашелся? В конце концов, Report Server должен как-то отобразить report в окне browser. SOAP method вряд-ли подходит для этого. Представьте себе это сами. Как именно вызвать такой SOAP method? Будь я на месте архитекторов Reporting Services, я бы предложил еще одну, дополнительную Web application, которая будет заниматься ислючительно этим - генерировать HTML из report definition (RDL). Такая аппликация существует. И называется она - (отгадайте, догадливые) - Report Processor. Разделение обязанностей между ними очень простое: Report Server отвечает за операции с reports в базе данных, все его методы обращаются к базе за различной информацией, уже ассоциированной с report, или добавляя к report разные элементы, properties.
Report Processor получает имя report, с одной стороны, и (за кулисами - из базы) его properties, с другой, и на основе этих двух, генерирует HTML. Доступ к Report Processor - это и есть известный в документации - URL access.
Выглядит это так:
http://server/reportserver?[/reportpath]&prefix:param=value[@prefix:param=value]...n]
Например : http://flex/reportserver?/everest/agencyReport
Пусть вас не смущает тот же адрес - и для Report Server, и для Report Processor - по сути вы запрашиваете ту самую, дополнительную Web application - Report Processor.
Все бы ничего, но у report есть параметры. Если бы Report Processor имел только URL access, запрос того же самого report с другими параметрами сводился бы каждый раз к изменeнию URL. Это не удобно (хотя тоже возможно)- полный refresh, как ни как. Да и что делать в случае, если report нужно разместить hosted в другой странице? Среди samples, поставляемых с Repoting Services, есть ответ на эту "проблему" - Report Viewer. Не совсем, правда, понятно, почему он удостоился только места в samples, когда внешний вид Report Preview из MS Studio Report Designer от него не отличим, а чего он делает внутри, можно только предположить, что именно его-то разработчики и вынесли в samples.
Но, как бы там не было, он отлично
Читать далее...
комментарии: 0 понравилось! вверх^ к полной версии
НОЧЬ НЕВЕСТЫ 24-09-2004 19:22


http://rare.narod.ru/lena.html
комментарии: 0 понравилось! вверх^ к полной версии
Пьянючий чувак в разорванной рубашке, на морде у 18-09-2004 03:26


Пьянючий чувак в разорванной рубашке, на морде у которого следы помады, в карманах - пустые бутылки, заходит в автобус и садится рядом с попом. Пьяный разворачивает газету и что-то там читает. Потом поворачивается к попу и спрашивает:
- А вы не знаете, отец, от чего бывает артрит?
- Артрит, сын мой, бывает у тех людей, кто сбился с пути истинного, кто спит с падшими женщинами и злоупотребляет алкоголем!!!
- Ни хрена себе...
Пьяный замолкает и смотрит задумчивым взглядом в пол. Поп пожалел, что высказался так резко:
- Ну, ладно, сын мой! Давно ли у тебя артрит?
- Да вы что! У меня нет артрита! Тут в газете пишут, что артрит у Папы Римского!
комментарии: 0 понравилось! вверх^ к полной версии
Plan what you do - do what you planed 18-09-2004 00:34


Никак не могу отделаться от этой банальности, но впору, когда я работал в ClickSoftware, там на стене висел плакатик, изображающий толстую жирную окружность с тремя симметричными точками на ней. Над окружностью была надпись - что-то вроде : "Так делают QA", а возле точек было написано так: над верхней - "Plan what you do", правее по часовой - "Do what you planed" и дальше - "You'll get 0 bugs".
Насчет багов сказать с уверенностью не могу, а первые 2 пункта я бы вышил на левом рукаве той рубашки, в которой я родился.
комментарии: 0 понравилось! вверх^ к полной версии
Хочу быть дворником 16-09-2004 15:17


Этот рассказик хочу привести здесь целиком. Автор - Михаил Веллер.Есть люди, которые хотят познать все, и есть люди, которым тошно оттого, что они уже познали. И вот вторые молчат, чтобы не было хуже, апервые встревают всюду, надеясь сделать лучше. Чем нервируют окружающих. Такие люди не приемлют реальность, как карась не приемлет сковородку.Шкварча от прикосновений мира, они полагают, что и для мира этиприкосновения не должны пройти бесследно. Их активные попытки оставитьслед вызывают у мира, в лице начальства и жены, обострение инстинктасамосохранения, что имеет следствиями полный набор неприятностей,именуемый жизненным опытом. И когда они сочтут, что их жизненный опыт ужедостаточен, они утихомириваются и складывают сказки о сивках, которыхукатали крутые горки - куда них никто не гнал, - когда нормальные конискакали по нормальным дорогам, бодро взмахивая хвостами, и ели на стоянкаховес. И взоры их обращаются к детям. Они, взрослые, учат их, детей, как бы они, взрослые, достигли того,чего должны достичь они, дети, если б они, взрослые, могли этого достичь.Это называется передавать опыт. Для детей начинается та еще жизнь. Знаю по себе. Детские мечты редко сбываются. Хочешь стать дворником, а становишьсяакадемиком. Хочешь вставать раньше всех, вдыхать чистую прохладу рассвета,шурша гнать метлой осенние листья, поливать асфальт из шланга, собиратьвсякие интересные вещи, потерянные накануне прохожими, здороваться сидущими на работу жильцами - все тебя знают, все улыбаются, и никакое тебеначальство не страшно, их много, а дворников не хватает, не понизят тебя -некуда, не уволят - самим улицы мести придется, а вместо этого таскаешьсясо скрипкой в музыкальную школу, с огромной папкой - в художественную, спортфелем пособий - на курсы английского языка, получаешь взбучки послеродительских собраний, маршируешь строем в пионерских лагерях, занимаешьсяс репетиторами, трясешься перед выпускными экзаменами, наживаешьневрастению после конкурсных, сессии, курсовые, диплом, распределение,мама в обмороке, папа звонит старым друзьям, женишься, стоишь в очередях,получаешь квартиру, покупаешь мебель, защищаешь кандидатскую, а детиподрастают, и только хочешь, чтобы они были счастливы. И без остановки: начальству нужны статьи, жене - шуба и машина, детям- штаны и велосипеды, потом - карманные деньги и свобода, потом высшееобразование, потом им нужны жены и мужья, а тебе нужна неотложка. Дети разъезжаются по городам, женятся, становятся на ноги, перестаюттебе писать, хорошо еще поздравляют с праздниками, ты становишьсядедушкой, выходишь на пенсию и получаешь возможность делать все, что душетвоей угодно. И получив, наконец, возможность делать все, что душе моей угодно, япошел в ЖЭК и легко устроился дворником. И теперь я встаю раньше всех,вдыхаю чистую прохладу рассвета, шурша гоню метлой осенние листья, и всежильцы знают меня и, идя на работу, здороваются со мной и улыбаются. И яполивают асфальт из шланга и думаю, неужели мир устроен так, чтообязательно надо сделать круг длиною в жизнь, чтобы прийти к тому, чегохотел? Наверное, это неправильно. И вся надежда, что хорошую сивку горкине укатают.
комментарии: 0 понравилось! вверх^ к полной версии
Triggers fired on DTS 02-09-2004 18:34


BULK INSERT command has an option to explicitly fire triggers on insert operations. Like:
BULK INSERT Northwind.dbo.[Order Details]
FROM 'f:orderslineitem.tbl'
WITH
(
FIELDTERMINATOR = '|',
ROWTERMINATOR = ':n',
FIRE_TRIGGERS
)
There is no obvious check box in DTS Designer to allow triggers firing. However, unchecking 'Use fast load' check-box just does it: triggerts are invoked!

[показать]
комментарии: 0 понравилось! вверх^ к полной версии
Reporting Services and OLAP 26-08-2004 16:35


The good news is, first of all, it's possible to build reports based on MDX Add data source based upon 'Microsoft OLE DB Provider for Olap Services 8.0' and specify MDX query selecting from some cube. For example, given FoodMart 2000 sample distributed with MSAS, specify the following query:
select
{[Measures].members} on Columns,
{[Store].members} on rows
from Sales.


[показать]


The bad news is that mentioned Olap provider does have native support for (both named and unnamed) parameters. As a compensation, Reporting Services enables the queries to be generated dynamically at runtime.
To create a parameter for a report based on Analysis Services data you should create a new dataset that will be used to populate the parametrs values and write something like
WHERE (" + Parametes!MyParam.Value + ")"
instead of
WHERE @parameter.
Could one ask why the @parameter is only supported by the ole (sql)-db-provider?
комментарии: 0 понравилось! вверх^ к полной версии
What does it mean (SQLAdapter) 24-08-2004 14:18


1). Warning message (5740)
The adapter "SQL" raised an error message. Details "<?xml version="1.0" encoding="utf-16" ?><EverestUpdate xmlns="urn:EverestUpdateEnvelope"><?MSSQLError HResult="0x80004005" Source="Microsoft XML Extensions to SQL Server" Description="Streaming not supported over multiple column result"?></EverestUpdate>".
is most likely indicates that you've forget for xml auto clause in your query.
комментарии: 0 понравилось! вверх^ к полной версии
SQLServer Adapter stuff 24-08-2004 02:56


Since SQLServer leaves unparsed ':' character in queries, it's possible (almost!) to produce the query output recognizable for further BTS processing. For example:

select 'urn:EverestUpdateDocument' as 'xmlns:ns1',
updateDate as 'ns1:updateDate',
updateProcessed as 'ns1:updateProcessed'
from Updates
for xml auto

produces

<updates xmlns:ns1="urn:EverestUpdateDocument" ns1:updateDate="2004-08-18T00:00:00" ns1:updateProcessed="0">
</updates>
<updates xmlns:ns1="urn:EverestUpdateDocument" ns1:updateDate="2004-08-1900:00:00" ns1:updateProcessed="0"></updates>

Unfortunatelly, however, there is no way to put in the same namespace the element holding the attributes In the examle below, the element "Updates' belongs to default namespace.

SQLServer Adapter makes unpossible to put in the (distinct) namespace the root element as well.
комментарии: 0 понравилось! вверх^ к полной версии
Using XPath inside Expression Shape 22-08-2004 16:58


Yes, it's possible! See how it is simple and usefull:
body()
{
System.Diagnostics.EventLog.WriteString("BTS",
xpath(inMsg, "string(//Root/Person[@sex='male']");
}
комментарии: 0 понравилось! вверх^ к полной версии
BTS and Reporting Services 20-08-2004 14:33


Reporting Services defines co-called "data extension" assemblies and can embed them into reports. Microsoft already (May 2004) implemented such data extension for BTS and ships it with the utility "BizTalk Server 2004 Configuration Management Report Generator".
комментарии: 0 понравилось! вверх^ к полной версии
Running VS.NET 2005 beta 1 and BizTalk Server 2004 together 25-07-2004 21:59


Disclaimer #1: This was smoke-screen tested only so it will have issues. If you find them then please post them in the comments on the blog to help others.

Discalimer #2: Don't do this on your main development box unless you holiday and definitely don't do this on a production box.

There, now I have got that out of the way - you are still keen to play with generics and all the crazy cool stuff in VS.NET 2005 beta 1 and at the same time you have production work to do in VS.NET 2003 with BizTalk Server 2004 and you want them to work all on the same machine? Ok, seems reasonable to me. The main issue is that you need to create a set of .config files to ensure that the BizTalk Server exe's and services run using the 1.1 version of the framework regardless of the fact you now have 2.0 installs. The way to do that is to edit or create config files for all these artifacts. Of course that would be tedious so here is a batch file and all the config files you need (hopefully).

One generic issue we are aware of that “debug attach to process” doesn't appear to work for VS.NET 2003 .NET CLR 1.1 applications in general post install. This makes it pretty challenging to debug custom components inside Orchestration.

Thanks to Aleksey and Andy Reeves for the information and pre-packaged configuration files.

комментарии: 1 понравилось! вверх^ к полной версии
Going binary with BizTalk 25-07-2004 21:55


When you want to create new message programmatically within an orchestration, you'd normally assign an XmlDocument object to your message. However: did you ever wonder how you could create non-XML messages within BizTalk Server orchestrations? (Assigning an XmlDocument would clearly not work here :-) )

For all of you "bitheads", here it is :

Option Explicit On
Option Strict On
Imports System
Imports System.Runtime.InteropServices
Imports Microsoft.XLANGs.BaseTypes

Namespace CLAESSENS.BTS2004.SAMPLES
_
Public Class MyStreamFactory
Implements Microsoft.XLANGs.BaseTypes.IStreamFactory
Private m_mystringdata As String = ""
Public Sub New(ByVal stringdata As String)
m_mystringdata = stringdata
End Sub
Public Overridable Function CreateStream() As System.IO.Stream _
Implements Microsoft.XLANGs.BaseTypes.IStreamFactory.CreateStream
return New IO.MemoryStream( _
System.Text.ASCIIEncoding.ASCII.GetBytes(m_mystringdata ))

End Function
End Class
_
Public Class MyMessageCreator

Public Sub CreateMyMessage(ByVal mydestmsg As XLANGMessage)
mydestmsg(0).LoadFrom(New MyStreamFactory("this is my data to create message from"))
End Sub
End Class
End Namespace
The trick here is in the IStreamFactory. BizTalk Server is able to create messages from such a factory class. In this example, I've just created a 'binary' message from a string, using ASCII encoding. However: you could just as well assign something like a .PDF file or image to your message if you want.
No limits! BizTalk Server rocks!

комментарии: 0 понравилось! вверх^ к полной версии
Passing message context to .NET components 25-07-2004 21:53


Since I felt that this is certainly not clear to everyone that uses BizTalk, some comments:

Most people are passing data to their own assemblies by passing messages, typed as an XmlDocument.  This, however does not give you access to multiple parts of that message and certainly not, to the message's context.

If you ever need to have access to the context of a message, outside of the BizTalk Server orchestration environment, you may do so by passing the message as a parameter of type Microsoft.XLANGs.BaseTypes.XLANGMessage to a method in an expression shape.


комментарии: 0 понравилось! вверх^ к полной версии
FILE & FTP adapter: Manipulating File Names 25-07-2004 21:51



Very frequently, in the BizTalk Server newsgroups, I answer questions related to filenames used by the BizTalk Server FTP and FILE adapter. More in particular it seems that for many people it is hard to figure out:
- how to change the FILE/FTP adapter's output file name
- how to acces the FILE/FTP adapter's input file name

Let's change this and dive into the subject a little deeper:
...starting with the more easy thing: the FILE adapter's input and output filename.

When the FILE adapter receives a message, it promotes context on the message that contains information about the orginal filename. That context is accessible in:
  • a custom pipeline (where you'll have to program)
    • use the IBaseMessage you get passed by the pipeline framework
    • that interface provides you with a context property, which you can use to read promoted properties from
    • to give you a feeling, here's a (non-tested!) example:

      public IBaseMessage Execute(IPipelineContext pc, IBaseMessage inmsg)
      {
      //following namespace contains the FILE adapter properties:
      const string FILEadapterTargetNamespace = "http://schemas.microsoft.com/BizTalk/2003/file-properties";

      // retrieve the inbound file name that was promoted by the FILE adapter:
      string sourcePath = inmsg.Context.Read("ReceivedFileName", FILEadapterTargetNamespace ) as string;

      return inmsg;
      }
  • an orchestration (here you have intellisense)
    • drop in there an expression shape
    • you can access the context of you inbound message, using the context syntax (regular brackets after the messagename with in between the propertyname)


The FTP adapter does same thing upon receival of messages but obviously uses another context property to promote that information on.
It's namespace: http://schemas.microsoft.com/BizTalk/2003/ftp-properties
It's file name context property: ReceivedFileName

So far on the receival side of things, but what about sending? When sending files, the FILE and FTP differ somewhat in their approach...
Let's start again with the FILE adapter, where you basically have two options when you want to specify the outbound file name:
  • Using a static port: specify the outbound file name using one of the supported macro's

    This one's easy: the FILE adapter offers you some macros that you can use when binding the BizTalk Server messaging port.
    MSDN explains this very well, so I will not go into any details further here... (In addition I remember Jan already posted on this subject as well!)
  • Using a dynamic port: specify the outbound file name by setting context on the outbound message

    Setting context can be done both in a custom pipeline component as well as in an orchestrations expression shape. In any case, when using a dynamic send port in an orchestration, you should set the outbound URL. This can be done in any expression shape (you have intellisense for this). The engine will parse the URL and based upon the prefix (file:// or ftp://) it will use the correct adapter. In addition you may add other context as well (for example specifying the message's retry count).

    Setting context using a custom pipeline component is perhaps less straight forward, so let's look into this using a little sample:

    IBaseMessage Execute(IPipelineContext pc, IBaseMessage inmsg)
    {

    //following namespace contains the FILE adapter properties:
    const string FILEadapterTargetNamespace = "http://schemas.microsoft.com/BizTalk/2003/file-properties";

    // set the the outbound file name for the FILE adapter:
    inmsg.Context.Write("ReceivedFileName", FILEadapterTargetNamespace , "myOwnNewFileName.xml");

    return inmsg;
    }


So... that's it :-) Easy huh! The previous method can as well be used when having a static send port! If you explicitly set the filename in the context the FILE adapter will take this into account and won't use the "default" values specified for that BizTalk Server messaging port.

Now how does this work with the FTP adapter you might wonder? Unfortunately the FTP adapter does not have any macros you can use to set the outbound file name. However both the approach using the dynamic port as well as setting context manually works very well.

For example, inside an orchestration, I might set the location of a dynamic send port like this:
Читать далее...
комментарии: 0 понравилось! вверх^ к полной версии