<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title><![CDATA[Natale: новые сообщения]]></title>
    <link>http://www.gotdotnet.ru/blogs/natale/rss/</link>
    <description><![CDATA[WCF, .NET]]></description>
    <language>ru-RU</language>
    <lastBuildDate>Fri, 30 Jul 2010 06:03:58 UT</lastBuildDate>
    <generator><![CDATA[bitrix::blog.rss]]></generator>
    <docs>http://cyber.law.harvard.edu/rss/rss.html</docs>
    <item>
      <title><![CDATA[Ваш вклад в Windows Communication Foundation]]></title>
      <link>http://www.gotdotnet.ru/blogs/natale/8119/</link>
      <description><![CDATA[<p align="justify" style="MARGIN: 0cm 0cm 10pt">Если Вы являетесь разработчиком/архитектором/тестировщиком и в своих проектах используете <span>WCF</span>, то опрос (<!--noindex--><a href="http://mymfe.microsoft.com/WCF/Feedback.aspx?formID=283" rel="nofollow">Welcome to the .NET WCF Interoperability Survey</a><!--/noindex-->), проводимой командной разработчиков <span>Windows</span><span> </span><span>Communication</span><span> </span><span>Foundation</span>, создан специально для Вас. </p> <p align="justify" style="MARGIN: 0cm 0cm 10pt">Обеспечение интероперабельность между платформами должны быть легко и просто, правда? Но, к сожалению, это не всегда так. Но Ваш <span>feedback</span><span> </span>позволит в значительной мере улучшить совместимость и взаимодействие между платформами, в частности по средствам <span>WCF</span>. Пожалуйста, отправьте свой отзыв до 15 июля!</p> <p align="justify" style="MARGIN: 0cm 0cm 10pt">Опрос: <!--noindex--><a href="http://mymfe.microsoft.com/WCF/Feedback.aspx?formID=283" rel="nofollow">http://mymfe.microsoft.com/WCF/Feedback.aspx?formID=283</a><!--/noindex--></p>]]></description>
      <author><![CDATA[natale]]></author>
      <category><![CDATA[WCF]]></category>
      <guid isPermaLink="false">urn:bitrix:blog:post:8119</guid>
      <pubDate>Sun, 20 Jun 2010 18:34:26 UT</pubDate>
    </item>
    <item>
      <title><![CDATA[.Net 4.0: сценарии использования режима In-Process Side-by-Side (Inproc  SxS)]]></title>
      <link>http://www.gotdotnet.ru/blogs/natale/7810/</link>
      <description><![CDATA[<p align="justify"><strong>Inproc SxS</strong> - это новый функционал CLR 4.0, который позволяет запускать несколько версий .Net CLR в рамках одного процесса (см. статью &quot;<!--noindex--><a href="http://msdn.microsoft.com/ru-ru/magazine/ee819091.aspx" rel="nofollow">Подход In-Process Side-by-Side</a><!--/noindex-->&quot;). Данная возможность особенно актуальная с выходом .Net 4.0, т.к. теперь помимо новых возможностей платформы .Net, мы имеем и <strong>новую среду выполнения – CLR 4.0</strong>. Как видно из рисунка ниже .Net 2.0/3.0/3.5/3.5SP1 все использовали и базировались на CLR версии 2.0. Очевидно, что с введение новой CLR возникнет вопрос о совместимости и работоспособности кода, ранее написанного для платформы .Net младших версий.</p> <p align="justify"><img src="http://www.gotdotnet.ru/upload/blog/natale/315/CLRVersions.JPG" border="0"/></p> <p align="justify">Основная задача Inproc SxS - это решить вопрос совместимости и параллельного использования модулей/надстроек (Add-In и т.п.), написанных на .Net различных версий. Данный вопрос хорошо освещен в следующей статье &quot;<!--noindex--><a href="http://blogs.msdn.com/clrteam/archive/2009/06/03/in-process-side-by-side-part1.aspx" rel="nofollow">In-Process Side by Side (Part1)</a><!--/noindex-->&quot;, поэтому не будем подробно на этом останавливаться, а приведем несколько примеров использования In-Process Side-by-Side для Office Add-In:</p> <ol><li><div align="justify">Открытие существующих документов Office в новой версии пакета MS Office с возможностью использования Office Add-In, написанных для предыдущих версий пакета MS Office. Теперь данный сценарий может быть реализован корректно: благодаря Inproc SxS новые и старые Add-In’ы могут работать совместно в рамках одного экземпляра MS Office.</div> </li>
 <li><div align="justify">Обратная ситуация: открытие новых документов в предыдущей версии пакета MS Office с возможностью использования Office Add-In, написанных для новой версии пакета MS Office. Теперь данный сценарий может быть реализован корректно: благодаря Inproc SxS новые Add-In&amp;apos;ы, например, для CLR vNext (условно следующей версии .Net) и &quot;старые&quot; Add-In&amp;apos;ы (CLR 4.0) будут работать совместно корректно.</div> </li>
 </ol> <p align="justify">Важно понимать, что Inproc SxS - это решение вопроса совместимости модулей/надстроек, написанных на различных версиях .Net. Inproc SxS - это не замена миграции или решения вопроса совместимости приложения целиком с новой версией .Net.</p> <p align="justify">Рассмотрим следующие два сценария:</p> <ol><li><div align="justify">У нас есть <strong>библиотека</strong> (а не Add-In), написанная на <strong>.Net 3.5</strong>. Мы планируем ее использовать в нашем новом проекте и <strong>приложении</strong>, которое написано на <strong>.Net 4.0</strong>. В этом случае нам необходимо убедиться, что библиотека, написанная на .Net 3.5, корректно выполняется в среде .Net 4.0, т.е. режим Inproc SxS в данном случае не решит напрямую проблем совместимости, если таковые возникнут, т.к. &quot;<em>Library developers and consumers. Side-by-side hosting does not solve the compatibility problems that library developers face. A <font color="#F16522">library that is directly loaded by an application</font> - either through a direct reference or through an Assembly.Load call - continues to <font color="#F16522">use the runtime of the AppDomain it is loaded into</font>.</em>&quot;</div> </li>
 <li><div align="justify">У нас есть <strong>приложение</strong>, написанное на .<strong>Net 3.5</strong>. Мы планируем разрабатывать новые <strong>библиотеки</strong> для приложения на <strong>.Net 4.0</strong>. В этом случае нам необходимо мигрировать приложение на .Net 4.0 (аналогично предыдущему примеру), т.к. &quot;<em>If you have an <font color="#F16522">application</font> that was <font color="#F16522">built using an earlier runtime </font>and a <font><font color="#F16522">library</font> </font>that was <font color="#F16522">built using the .NET Framework 4</font>, you must <font color="#F16522">force your application</font> to also <font color="#F16522">use the .NET Framework 4</font>.</em>&quot; Net 4.0 поддерживает режим обратной совместимости, поэтому миграция может быть выполнена достаточно просто, например, даже без перекомпиляции приложения, а только указанием в конфигурационном файле, что требуется использовать CLR 4.0. <strong><div class="blog-code-box"><pre class="xml">&lt;configuration&gt;
   &lt;startup&gt; 
      &lt;supportedRuntime version=&quot;v4.0&quot; /&gt;
   &lt;/startup&gt;
&lt;/configuration&gt;</pre></div></strong></div> </li>
 </ol>]]></description>
      <author><![CDATA[natale]]></author>
      <category><![CDATA[.net]]></category>
      <guid isPermaLink="false">urn:bitrix:blog:post:7810</guid>
      <pubDate>Sat, 08 May 2010 19:01:07 UT</pubDate>
    </item>
    <item>
      <title><![CDATA[WCF: аутентификация по Kerberos и HTTPS передача данных]]></title>
      <link>http://www.gotdotnet.ru/blogs/natale/7809/</link>
      <description><![CDATA[<p align="justify">Задача: установить между клиентом и сервисом WCF безопасное соединение на транспортном уровне (с использование сертификата) и при этом применить аутентификацию по протоколу Kerberos. <br/>
</p> <p align="justify">Решение: кастомная привязка (binding) c параметром <strong>authenticationMode</strong>, установленным в значение <!--noindex--><a href="http://msdn.microsoft.com/en-us/library/aa751836.aspx" rel="nofollow"><strong>KerberosOverTransport</strong></a><!--/noindex-->.</p> <p align="justify"><div class="blog-code-box"><pre class="xml">&lt;customBinding&gt;
   &lt;binding name=&quot;kerberosCustomBinding&quot;&gt;
      &lt;security authenticationMode=&quot;KerberosOverTransport&quot; /&gt;
      &lt;httpsTransport /&gt;
   &lt;/binding&gt;
&lt;/customBinding&gt;
</pre></div></p> <p align="justify"><em>Примечание</em>: при подобной конфигурации необходимо прописать для учетной записи, от которой работает WCF сервис (пул IIS), SPN (Service Principal Name), например, <span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Calibri&quot;, &quot;sans-serif&quot;; FONT-SIZE: 11pt">setspn.exe<span> </span>-a http\&lt;serverFQDN&gt; &lt;domain\wcfserviceaccount&gt;. </span>А в конфигурационном файле клиента выставить соответствующие значение (<!--noindex--><a href="http://msdn.microsoft.com/ru-ru/library/aa347698(en-us).aspx" rel="nofollow">&lt;servicePrincipalName&gt;</a><!--/noindex--> тэг), например, &lt;servicePrincipalName value=&quot;http\&lt;serverFQDN&gt;&quot;&gt;, где &lt;serverFQDN&gt; - полное доменное имя <strong>сервера</strong>, а <font>&lt;domain\wcfserviceaccount&gt; - доменная <strong>учетная запись</strong>, от имени которой запущен <strong>WCF сервис</strong>.</font></p>]]></description>
      <author><![CDATA[natale]]></author>
      <category><![CDATA[WCF]]></category>
      <guid isPermaLink="false">urn:bitrix:blog:post:7809</guid>
      <pubDate>Sat, 08 May 2010 18:11:23 UT</pubDate>
    </item>
    <item>
      <title><![CDATA[WCF: как задать timeout при вызове конкретного метода сервиса?]]></title>
      <link>http://www.gotdotnet.ru/blogs/natale/7808/</link>
      <description><![CDATA[<p align="justify">Допустим у нас есть следующий код:</p> <p align="justify"><div class="blog-code-box"><pre class="csharp">IServiceContract proxy = ChannelFactory&lt;IServiceContract&gt;.CreateChannel(binding, address);
((IClientChannel)proxy).Open(TimeSpan.FromMinutes(1));
proxy.Method1();
proxy.Method2();</pre></div>Необходимо, чтобы timeout выполнения Method1 и Method2 были различными, т.е. например: <br/>
proxy.Method1() – <strong>timeout = 5 минут</strong> (TimeSpan.FromMinutes(5)) <br/>
proxy.Method2() – <strong>timeout = 10 минут</strong> (TimeSpan.FromMinutes(10))</p> <p align="justify">Для выполнения данной задачи нам необходимо выполнить преобразование к <strong>IContextChannel</strong> интерфейсу и установить значение параметра <strong>OperationTimeout</strong>, либо напрямую получить доступ к <strong>InnerChannel</strong> и выставить значение <strong>OperationTimeout</strong>.</p> <p align="justify"><div class="blog-code-box"><pre class="csharp">proxy.Service1Client client = new proxy.Service1Client();
client.InnerChannel.OperationTimeout = TimeSpan.FromMinutes(5);
Console.WriteLine(client.Method1());
client.InnerChannel.OperationTimeout = TimeSpan.FromMinutes(10);
Console.WriteLine(client.Method2());
Console.ReadLine();</pre></div></p>]]></description>
      <author><![CDATA[natale]]></author>
      <category><![CDATA[WCF]]></category>
      <guid isPermaLink="false">urn:bitrix:blog:post:7808</guid>
      <pubDate>Sat, 08 May 2010 09:56:17 UT</pubDate>
    </item>
    <item>
      <title><![CDATA[WCF 4.0: поддержка REST]]></title>
      <link>http://www.gotdotnet.ru/blogs/natale/7676/</link>
      <description><![CDATA[<p align="justify">Поддержка REST появилась еще в предыдущей версии WCF 3.5, в частности появилась возможность публиковать операции сервиса для вызова по GET/POST (атрибут WebInvoke). Разумеется, только этим поддержка REST не ограничивалось, еще был создан дополнительный модуль - WCF REST Starter Kit, который, к сожалению, не был составной частью .Net Framework. <br/>
В версии WCF 4.0 возможности REST программирования уделено не меньше внимания, чем и традиционной SOAP модели, и REST – это теперь полноценная составная часть структуры WCF.</p> <p align="justify"><strong>WebGet/WebInvoke</strong> - специальные атрибута операции сервиса, которые определяют, что данная операция может быть вызвана по HTTP GET или HTTP POST соответственно, т.е. не требуется формирования SOAP конверта, а достаточно стандартного HTTP запроса. Обычно операция сервиса вызывается с некоторыми входными параметрами, в данном случае входные параметры могут быть переданы либо через URL (query string), либо через тело HTTP запроса (post data). Для удобства извлечения значений входных параметров из URL можно использовать специальную конструкцию – <strong>UriTemplate</strong>, позволяющую описать структуру и разбор URL, по которому вызвается сервис.</p> <p align="justify"><div class="blog-code-box"><pre class="csharp">[WebGet(UriTemplate = &quot;Users/{userName}&quot;)]   
public User GetUser(string userName)
{   
}
[WebInvoke(UriTemplate = &quot;Tasks/{id}&quot;, Method = &quot;PUT&quot;)]  
public Task UpdateTask(string id, Task task)  
{  
}</pre></div></p> <p align="justify">В примере операция GetUser публикуется по GET и принимает входной параметр (из URL) userName. Обратите внимание, что преобразование типа входного параметра к srting производится автоматически, т.е. вместо string может быть указан любой другой простой тип, например, int. <br/>
Операция UpdateTask публикуется по метод HTTP PUT, с входным параметром id все аналогично вышеописанной ситуации, входной параметр task извлекается из тела (body) HTTP запроса. При необходимости Вы имеете возможность работать с телом HTTP запросом напрямую, для этого в параметрах метода потребуется указать единственный входной параметр типа <strong>Steam</strong>.</p> <p align="justify"><strong>Help-страница</strong> – это специальная страница, содержащая информацию о REST WCF сервисе, в частности, название операций, формат запроса/ответа, схемы данных и т.п. (чем-то напоминает WSDL, хотя важно помнить, что это не WSDL). Для созданного WCF REST сервиса подобная страница создается автоматически, при необходимости она может быть кастомизирована.</p> <p align="justify"><img src="http://www.gotdotnet.ru/upload/blog/natale/9d1/HelpPage.gif" border="0"/></p> <p align="justify"><div class="blog-code-box"><pre class="xml">&lt;configuration&gt;
  &lt;system.serviceModel&gt;
    &lt;serviceHostingEnvironment aspNetCompatibilityEnabled=&quot;true&quot;/&gt;
    &lt;behaviors&gt;
      &lt;endpointBehaviors&gt;
        &lt;behavior name=&quot;HelpBehavior&quot;&gt;
          &lt;webHttp helpEnabled=&quot;true&quot; /&gt;
        &lt;/behavior&gt;
      &lt;/endpointBehaviors&gt;
    &lt;/behaviors&gt;
    &lt;services&gt;
      &lt;service name=&quot;CounterResource&quot;&gt;
        &lt;endpoint behaviorConfiguration=&quot;HelpBehavior&quot;
                  binding=&quot;webHttpBinding&quot;
                  contract=&quot;CounterResource&quot; /&gt;
      &lt;/service&gt;
    &lt;/services&gt;
  &lt;/system.serviceModel&gt;
&lt;/configuration&gt;</pre></div></p> <p align="justify">В примере включается автоматическая генерация Help-страницы, в этом случае страница будет доступна по следующему адресу http://server/restwcfservice/<strong>help</strong>.</p> <p align="justify"><strong>Поддержка JSON/JSONP</strong>. Помимо XML формата запроса/ответа WCF REST поддерживает и другие форматы, например: JSON, JSONP. Возможно включение и поддержки ATOM, но для этого на текущий момент потребуется небольшая кастомизация. Формат возвращаемых данных клиенту может быть определен автоматически за счет параметра automaticFormatSelectionEnabled, т.е. Вам не потеряется создавать несколько методов или разветвленную логику для того, чтобы выдать клиенту ответ в предпочтительном для него формате. Важно, что automaticFormatSelectionEnabled применяется к исходящему запросу, т.е. на данный момент ограничить входящие запросы конкретным форматом (JSON или XML) нельзя, запрос в любом формате будет принят сервисом. Логика автоматического выбора формата ответа достаточно проста и логична:</p> <ol><li><div align="justify">Анализируется HTTP Accept заголовок HTTP запроса. Если HTTP Accept отсутствует, то переходим к следующему пункту.</div> </li>
 <li><div align="justify">Анализируется content-type запроса. Если тело HTTP запроса отсутствует (пустое) или content-type имеет поддерживаемое значение, то переходим к следующему пункту.</div> </li>
 <li><div align="justify">Ответ выдается в формате по умолчанию для операции.</div> </li>
 </ol> <p align="justify"><div class="blog-code-box"><pre class="xml">&lt;configuration&gt;
  &lt;system.serviceModel&gt;
    &lt;serviceHostingEnvironment aspNetCompatibilityEnabled=&quot;true&quot; /&gt;
    &lt;behaviors&gt;
      &lt;endpointBehaviors&gt;
        &lt;behavior name=&quot;HelpBehavior&quot;&gt;
          &lt;webHttp helpEnabled=&quot;true&quot; /&gt;
        &lt;/behavior&gt;
      &lt;/endpointBehaviors&gt;
    &lt;/behaviors&gt;
    &lt;services&gt;
      &lt;service name=&quot;CounterResource&quot;&gt;
        &lt;endpoint behaviorConfiguration=&quot;HelpBehavior&quot;
                  binding=&quot;webHttpBinding&quot;
                  contract=&quot;CounterResource&quot; /&gt;
      &lt;/service&gt;
    &lt;/services&gt;
  &lt;/system.serviceModel&gt;
&lt;/configuration&gt;</pre></div></p> <p align="justify">В примере в конфигурационном файле включается опция автоматического определения формата ответа REST сервиса.</p> <p align="justify"><br/>
Возможность WCF автоматического формирования ответа в приемлемом для клиента формате очень удобна, и не менее удобная и полезна поддержка JSONP формата, которая включена в WCF REST. <strong>В чем отличие JSON от JSONP?</strong> JSONP (JSON Padding) является расширением JSON, когда имя функции обратного вызова указывается в качестве входного аргумента [wiki]. JSOPN используется для кросс доменных вызовов, см. <!--noindex--><a href="http://ru.wikipedia.org/wiki/JSON#JSONP_.26_JSONPP" rel="nofollow">JSONP &amp; JSONPP</a><!--/noindex-->.</p> <p align="justify"><strong>WebFaultException</strong> - это специальный класс для возврата ошибки (exception) клиенту. WebFaultException наследуется от стандартного FaultException, который определяет формат SOAP исключения. Т.к. REST сервис – это не стандартный SOAP сервис, то и информирование клиента об исключение должно производиться иначе, т.к. SOAP-исключение, обернутое в SOAP конверт, клиент просто не распознает. Поэтому для REST сервисов используется WebFaultException. Отличительной особенностью WebFaultException является то, что ошибка возвращается клиенту в приемлемом для него формате, т.е. если входной запрос пришел в формате JSON, то и информация об ошибке/исключении так же возвратится в формате JSON. WebFaultException помимо описания ошибки имеет и еще одно поле (которое отсутствует в SOAP FaultException) – это статус HTTP (HttpStatusCode), т.к. для REST это важно.</p> <p align="justify"><div class="blog-code-box"><pre class="csharp">if (user == null) 
{ 
	throw new WebFaultException&lt;string&gt;( 
            string.Format(&quot;There is no user with the userName &amp;apos;{0}&amp;apos;.&quot;, userName), 
            HttpStatusCode.NotFound); 
}
</pre></div></p> <p align="justify">В примере на клиента возвращается текст ошибки и HTTP статус NotFound.</p> <p align="justify"><strong>ASP.NET Routing</strong>. WCF REST сервисы поддерживает стандартный ASP.NET Routing (для этого режим совместимость с ASP.NET - <strong>aspnetcompatibilityenabled</strong> - должен быть включен в конфигурационном файле). <br/>
Маршрутизация ASP.NET позволяет использовать URL-адреса, не сопоставляемые с определенными файлами на веб-узле. Подробнее о маршрутизации ASP.NET можно прочесть в статье &quot;<!--noindex--><a href="http://msdn.microsoft.com/ru-ru/library/cc668201.aspx" rel="nofollow">Маршрутизация ASP.NET</a><!--/noindex-->&quot;.</p> <p align="justify"><div class="blog-code-box"><pre class="csharp">private void RegisterRoutes(RouteCollection routes)
{
    routes.Add(new ServiceRoute(&quot;Customers&quot;, new WebServiceHostFactory(), typeof(Service))); 
}</pre></div></p> <p align="justify"><div class="blog-code-box"><pre class="xml">&lt;system.webServer&gt;
  &lt;modules runAllManagedModulesForAllRequests=&quot;true&quot;&gt;
    &lt;add name=&quot;UrlRoutingModule
     type=&quot;System.Web.Routing.UrlRoutingModule, System.Web /&gt;
  &lt;/modules&gt;
  &lt;handlers&gt;
    &lt;add name=&quot;UrlRoutingHandler&quot; path=&quot;UrlRouting.axd&quot;	preCondition=&quot;integratedMode&quot; verb=&quot;*&quot; /&gt;   
  &lt;/handlers&gt;
&lt;/system.webServer&gt;</pre></div></p> <p align="justify">В примере для WCF REST сервиса подключается в web.config модуль ASP.NET Routing – UrlRoutingModule, а так же в методе RegisterRoutes опредеяются правила маршрутизации (с входным запросом по URL <!--noindex--><a href="http://server/wcfrestservice/customers" rel="nofollow">http://server/wcfrestservice/customers</a><!--/noindex--> сопоставляется операция REST сервиса).</p> <p align="justify"><strong>Кэширование</strong>. WCF REST сервисы поддерживает стандартный механизм кэширования ASP.NET (для этого режим совместимость с ASP.NET - <strong>aspnetcompatibilityenabled</strong> - должен быть включен в конфигурационном файле). Для определения параметров кэширования исходящего ответа к операции добавляется атрибут AspNetCacheProfile, в котором указывается имя профиля кэширования, тогда как сам профиль определяется в web.config. Следующие типы кэширования поддерживаются: Any | Client | Downstream | Server | None | ServerAndClient. Интересными являются следующие: </p> <ul><li><div align="justify">Client – кэширование данных на стороне клиента, т.е. кэшируемые данные не разделяемые;</div> </li>
 <li><div align="justify">Server – кэширование данных на стороне сервера, т.е. кэшируемые данные разделяемые;</div> </li>
 <li><div align="justify">Downstream - кэширование данных на стороне, например, прокси-сервера.</div> </li>
 </ul> <p align="justify"><div class="blog-code-box"><pre class="csharp">[AspNetCacheProfile(&quot;CacheFor60Seconds&quot;)]
[WebGet(UriTemplate=XmlItemTemplate)]
public Counter GetItemInXml()
{
    return HandleGet();
}</pre></div></p> <p align="justify"><div class="blog-code-box"><pre class="xml">&lt;configuration&gt;
  &lt;system.web&gt;
    &lt;caching&gt;
      &lt;outputCacheSettings&gt;
        &lt;outputCacheProfiles&gt;
        &lt;add name=&quot;CacheFor60Seconds&quot; duration=&quot;60&quot; varyByParam=&quot;format&quot; /&gt;
        &lt;/outputCacheProfiles&gt;
      &lt;/outputCacheSettings&gt;
    &lt;/caching&gt;
  &lt;/system.web&gt;
  &lt;system.serviceModel&gt;
    &lt;serviceHostingEnvironment aspNetCompatibilityEnabled=&quot;true&quot; /&gt;
  &lt;/system.serviceModel&gt;
&lt;/configuration&gt;</pre></div></p> <p align="justify">В примере устанавливается режим совместимости с ASP.NET, а так же режим кэширования: данные кэшируются на сервере (по умолчанию), данные актуальны в течение одной минуты и зависят от входящего формата запросам, т.е. для JSON формата входящего запроса кэшируется один ответа, а для XML – другой.</p> <p align="justify">Веб-каст с примерами по обсуждаемым возможностям можно найти на портале TechDays.ru - &quot;<!--noindex--><a href="http://www.techdays.ru/videos/2457.html" rel="nofollow">WCF 4.0 в примерах. Часть 2.&quot;.</a><!--/noindex--> <br/>
</p>]]></description>
      <author><![CDATA[natale]]></author>
      <category><![CDATA[wcf]]></category>
      <category><![CDATA[rest]]></category>
      <guid isPermaLink="false">urn:bitrix:blog:post:7676</guid>
      <pubDate>Sun, 25 Apr 2010 17:42:04 UT</pubDate>
    </item>
    <item>
      <title><![CDATA[WCF 4.0: интеграция с Workflow Foundation]]></title>
      <link>http://www.gotdotnet.ru/blogs/natale/7631/</link>
      <description><![CDATA[<p align="justify">Помимо уже описанных новых возможностей в WCF 4.0 (<!--noindex--><a href="http://www.gotdotnet.ru/blogs/natale/7403/" rel="nofollow">WCF 4.0: маршрутизация (routing)</a><!--/noindex--> и <!--noindex--><a href="http://www.gotdotnet.ru/blogs/natale/7265/" rel="nofollow">WCF 4.0: упрощенная конфигурация</a><!--/noindex-->) сегодня предлагаю поговорить об <span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 12pt">интеграции </span>WCF 4.0 и WF 4.0. Совместное использование WCF и WF <font><span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 12pt">предоставляет</span> множество преимуществ и позволяет реализовать многие бизнес-сценарии или бизнес-задачи значительно проще и быстрее, особенно учитывая появление в <span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 12pt">ближайшее </span>время RTM версии <span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 12pt">бесплатного </span>дополнения к серверу приложений Windows под названием AppFabric. AppFabric позволяет отслеживать и управлять жизненным циклом WCF и WF сервисов (инсталляция/конфигурирование/мониторинг/диагностика/и т.п.).</font></p> <p align="justify">Интеграция между WCF и WF существовала и в версии .Net 3.5. Например, можно было опубликовать WF как WCF сервис или взывать синхронно/асинхронно WCF из созданного рабочего-процесса (WF). Но контролировать процесс выполнения WF было не так просто, помимо этого существовала вторая &quot;проблема&quot; - Workflow Runtime потребляла немало ресурсов при инициализации или реинициализации (возобновления работы) экземпляров WF сервисов, поэтому достаточно часто бизнес-логика реализовывалась в виде библиотек и классов, а не рабочих процессов.</p> <p align="justify">В версии WCF 4.0 и WF 4.0 все эти замечания были учтены. В .Net 4.0 Workflow Runtime не только расширила свои возможности, но и была полностью переработана (в том числе и повысилась производительность). Далее поговорим о тех преимуществах и &quot;новинках&quot;, которые связаны с интеграцией WCF и WF.</p> <p align="justify"><strong>WorkflowServiceHost</strong> - специальный класс, <span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 12pt">обеспечивающий </span>запуск/выполнение WF сервисов из Вашего приложения в случае, если WF сервис не размещен на IIS/WAS (на самом деле IIS/WAS так же используют WorkflowServiceHost, но это является прозрачным для конечного разработчика). WorkflowServiceHost используется для запуска WF, конфигурирования конечных точек (endpoint) и настроек безопасности, а так же для запуска слушателей (listener) входящих запросов.</p> <p align="justify"><div class="blog-code-box"><pre class="csharp">WorkflowServiceHost host = new 	WorkflowServiceHost(&quot;HelloWorld.xamlx&quot;, new Uri(&quot;http://localhost:8080/helloworld&quot;));
host.AddDefaultEndpoints();
host.Description.Behaviors.Add(new ServiceMetadataBehavior{ HttpGetEnabled = true });
host.Open();
</pre></div></p> <p align="justify">В приведенном примере из консольного приложения запускается хост для декларативного WF сервиса (*.xamlx), задается URI адрес сервиса, инициализируются конечные точки (endpoint) по умолчанию и начинается прослушивание входящих сообщений.</p> <p align="justify"><strong>WorkflowControlEndpoint</strong> - конечная точка, позволяющая управлять экземплярами WF, в частности это команды Run, Suspend, Resume, Terminate, Cancel, и Abandon.</p> <p align="justify"><div class="blog-code-box"><pre class="csharp">WorkflowServiceHost host = new WorkflowServiceHost(&quot;HelloWorld.xamlx&quot;,
	new Uri(&quot;http://localhost:8080/helloworld&quot;));
host.AddDefaultEndpoints();
WorkflowControlEndpoint wce = new WorkflowControlEndpoint
	(new NetNamedPipeBinding(),
	new EndpointAddress(&quot;net.pipe://localhost/helloworld/WCF&quot;));
host.AddServiceEndpoint(wce);
host.Open();
IWorkflowCreation creationClient = new ChannelFactory&lt;IWorkflowCreation&gt; 
	(creationEndpoint.Binding, creationEndpoint.Address).CreateChannel();
Guid instanceId = creationClient.CreateSuspended(null);
WorkflowControlClient controlClient = new WorkflowControlClient(controlEndpoint);
controlClient.Unsuspend(instanceId);
</pre></div></p> <p align="justify">В данном примере объявляется специальная конечная точка (endpoint) - WorkflowControlEndpoint, доступная по именованному каналу (named pipe). Далее создается канали взаимодействия (CreareChannel) и происходит обращение к WorkflowControlClient, позволяющему посылать команду управления WF сервису, в частности конкретному экземпляру (за счет указания уникального идентификатора экземпляра, instanceId).</p> <p align="justify"><strong>Корреляция</strong> - это специальный механизм сопоставления конкретного экземпляра WF (а так же конкретных активностей внутри WF) с событиями/данными, адресованными именно данному экземпляру. Например, у нас есть WF, который запускается, выполняет какие-либо действия, посылает запрос во <span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 12pt">внешнюю</span> систему и ожидает ответа от этой внешней системы. Очевидно, что одновременно могу существовать несколько экземпляров подобного WF, созданные различными пользователями. Каждый из этих активных экземпляров ожидает &quot;своего&quot; ответа от внешней системы, который зависит от данных именного данного экземпляра WF. Механизм корреляции позволяет Workflow Runtime верно сопоставить экземпляр WF и предназначенную ему информацию.</p> <p align="justify">В основе механизма корреляции лежит такое понятие как токен корреляции, который уникален для каждого экземпляра WF.</p> <p align="justify">WF 4.0 поддерживает следующие виды корреляции:</p> <ul><li><div align="justify">на основе протокола (protocol-based): транспортного уровня (request-reply correlation) или контекста (context correlation);</div> </li>
 <li><div align="justify">на основе бизнес-логике/бизнес-данных (content-based): собственные (пользовательские) данные в SOAP сообщении (content correlation).</div> </li>
 </ul> <p align="justify">Примером корреляции первого вида (protocol-based) типа запрос/ответ (request-reply correlation) может служить, например, вызов внешнего веб-сервиса, т.е. исходящему HTTP-запросу <span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 12pt">соответствует</span> конкретный ответ HTTP-ответ.</p> <p align="justify">Для корреляции первого вида (protocol-based), основанной на контексте (context correlation) необходимо использование привязок (binding), поддерживающих контекстный обмен сообщений BasicHttpContextBinding, WSHttpContextBinding и NetTcpContextBinding.</p> <p align="justify">В этих двух случаях механизм корреляции практически прозрачен для разработчика, т.е. сопоставление выполняется автоматически за счет транспортного уровня или контекста WCF.</p> <p align="justify">В случае корреляции, основанной на бизнес-логике (content-based correlation), разработчик явным образом указывает какие данные SOAP сообщения используются для сопоставления. Например, это может быть уникальный идентификатор заказа.</p> <p align="justify">Получается, что теперь понятие корреляции - это не только <span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 12pt">внутренний</span> механизм WF, а скорее разделяемый механизм между WCF и WF (разбор SOAP сообщения, взаимодействие с привязками (binding) и т.п.).</p> <p align="justify">Более подробную информация и примеры по данной теме Вы можете найти в одной из моих предыдущих заметок - &quot;<!--noindex--><a href="http://www.gotdotnet.ru/blogs/natale/6981/" rel="nofollow">Корреляция в WF-сервисах 4.0</a><!--/noindex-->&quot;.</p> <p align="justify"><div class="blog-code-box"><pre class="csharp">Variable&lt;string&gt; Item = new Variable&lt;string&gt;();
Variable&lt;CorrelationHandle&gt; OrderHandle = new Variable&lt;CorrelationHandle&gt;();
Receive StartOrder = new Receive
{
    CanCreateInstance = true,
    ServiceContractName = OrderContractName,
    OperationName = &quot;StartOrder&quot;
};

SendReply ReplyToStartOrder = new SendReply
{
    Request = StartOrder,
    CorrelationInitializers =
    {
        new ContextCorrelationInitializer
        {
            CorrelationHandle = OrderHandle
        }
    }
};
</pre></div>В данном примере инициализируется токен корреляции, который будет использоваться в дальнейшем в WF. Как Вы видите, токен корреляции - это специальный тип объекта в .Net WF.</p> <p align="justify"><strong>SendReply/ReceiveReply</strong> - это новые активности, упрощающие интеграцию между WCF и WF. Данные активности моделируют сервисные операции получения сообщения и отправки ответного сообщения. </p> <p align="justify">SendReply активность в совокупности с Receive активностью моделирует операцию сервиса запрос/ответ (request-reply). ReceiveReply активность в совокупности с Send активностью может использоваться для вызова <span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 12pt">внешнего</span> сервиса из создаваемого WF. <br/>
</p> <p align="justify">Веб-каст с примерами по обсуждаемым возможностям можно найти на портале TechDays.ru - &quot;<!--noindex--><a href="http://www.techdays.ru/videos/2457.html" rel="nofollow">WCF 4.0 в примерах. Часть 2.&quot;.</a><!--/noindex--> <br/>
</p>]]></description>
      <author><![CDATA[natale]]></author>
      <category><![CDATA[wcf]]></category>
      <category><![CDATA[wf]]></category>
      <guid isPermaLink="false">urn:bitrix:blog:post:7631</guid>
      <pubDate>Sun, 18 Apr 2010 11:34:51 UT</pubDate>
    </item>
    <item>
      <title><![CDATA[Обращение к WCF сервису из Silverlight приводит к созданию больших по размеру временных файлов]]></title>
      <link>http://www.gotdotnet.ru/blogs/natale/7630/</link>
      <description><![CDATA[<p align="justify" style="MARGIN: 0cm 0cm 10pt"><font>Недавно ко мне поступил следующий вопрос: &#171;<em>При запуске приложения под IE в темповой папке начинают появляться XPC….tmp файлы размером точно 20 М на каждый вызов метода сервиса. При исследовании причины выяснилось, что они появляются только тогда, когда в контракте службы используются пользовательские типы. В процессе работы временные файлы постепенно удаляются. Отсюда возникает вопрос: можно - ли как-то влиять на создание этих файлов, их более оперативное удаление (например, сразу же после закрытия канала) или их размер?</em>&#187;</font></p> <p align="justify" style="MARGIN: 0cm 0cm 10pt"><font>В ходе анализа были выполнены следующие действия:</font></p> <ol><li><div align="justify" style="MARGIN: 0cm 0cm 10pt"><font><font>Включение мониторинга информации о создании файлов, в частности в директории %localappdata% \Temp, подтвердило, что в данной директории создаются временные файлы с именем XCP*.tmp, где * - уникальная последовательность цифр.</font></font></div> </li>
 <li><div align="justify" style="MARGIN: 0cm 0cm 10pt"><font><font>Создано аналогичное WPF приложение. С его помощью не удалось воспроизвести проблему.</font></font></div> </li>
 <li><div align="justify" style="MARGIN: 0cm 0cm 10pt"><font><font>Утилитой ProcMon выполнен мониторинг временных файлов, создающихся Internet Explorer.</font></font></div> </li>
 </ol> <p align="justify" style="MARGIN: 0cm 0cm 10pt">Причина: использование GZip сжатия HTTP потока в Silverlight.</p> <p align="justify" style="MARGIN: 0cm 0cm 10pt"><strong>Пути решения:</strong></p> <ol><li><div align="justify">Периодически выполнять прямой вызов <strong>GC.Collect()</strong> в Вашем приложении. Например, этот вызов может зависеть таймера, количества выполненных запросов и т.п. </div> </li>
 <li><div align="justify"><strong>Отключить GZip</strong> сжатие для HTTP ответов.</div> </li>
 <li><div align="justify">В Silverlight 4.0 можно так же установить параметр <!--noindex--><a href="http://msdn.microsoft.com/ru-ru/library/system.net.httpwebrequest.allowwritestreambuffering.aspx" rel="nofollow"><strong>AllowReadStreamBuffering</strong></a><!--/noindex--> в значение false.</div> </li>
 </ol> <p align="justify" style="MARGIN: 0cm 0cm 10pt">При написании данной заметки обнаружила недавно появившуюся статью в Knowledge Base - &quot;<!--noindex--><a href="http://support.microsoft.com/?id=982482" rel="nofollow">PRB:Silverlight application creates large temporary files when making calls to WebServices</a><!--/noindex-->&quot;, в которой причины возникновения данного поведения описаны более подробно.</p>]]></description>
      <author><![CDATA[natale]]></author>
      <category><![CDATA[wcf]]></category>
      <category><![CDATA[silverlight]]></category>
      <guid isPermaLink="false">urn:bitrix:blog:post:7630</guid>
      <pubDate>Sun, 18 Apr 2010 09:52:47 UT</pubDate>
    </item>
    <item>
      <title><![CDATA[Launch 2010: Visual Studio 2010 и .Net 4.0]]></title>
      <link>http://www.gotdotnet.ru/blogs/natale/7573/</link>
      <description><![CDATA[<p>Сегодня прошел &quot;глобальный запуск&quot; Visual Studio 2010 и .Net Framework 4.0, в том числе и в Москве (см. &quot;<!--noindex--><a href="http://www.microsoft.com/visualstudio/ru-ru/events/" rel="nofollow">Запуск Visual Studio в России</a><!--/noindex-->&quot;).</p> <p>Другие ссылки:</p> <ul><li><!--noindex--><a href="http://blogs.msdn.com/somasegar/archive/2010/04/11/announcing-visual-studio-2010-and-net-framework-4.aspx" rel="nofollow">Announcing availability of Visual Studio 2010 and .NET Framework 4</a><!--/noindex-->;</li>
 <li><!--noindex--><a href="http://www.microsoft.com/visualstudio/ru-ru/download" rel="nofollow">Ссылки для загрузки Visual Studio 2010</a><!--/noindex-->;</li>
 <li><!--noindex--><a href="http://www.microsoft.com/visualstudio/en-us/watch-it-live" rel="nofollow">Live keynotes</a><!--/noindex-->.</li>
 </ul>]]></description>
      <author><![CDATA[natale]]></author>
      <category><![CDATA[visual studio]]></category>
      <category><![CDATA[.net]]></category>
      <guid isPermaLink="false">urn:bitrix:blog:post:7573</guid>
      <pubDate>Mon, 12 Apr 2010 20:03:54 UT</pubDate>
    </item>
    <item>
      <title><![CDATA[Вызов WCF сервиса из WinPE]]></title>
      <link>http://www.gotdotnet.ru/blogs/natale/7553/</link>
      <description><![CDATA[<p align="justify">Постановка задачи следующая – опросить программно Active Directory из инсталлятора WinPE. На первый взгляд задача выглядит очень простой, но в WinPE отсутствует, например, поддержка ADSI (Active Directory Service Interfaces). ADSI представляет собой набор COM-интерфейсов для доступа к функциям служб каталогов. У WinPE есть и другие особенности, поэтому начнем с &#171;теории&#187;.</p> <p align="justify">WinPE – средства предустановки, это минимальная версия операционной системы Win32 с ограниченными службами, построенная на ядре Windows. Она используется для подготовки компьютера к установке Windows, копирования образа Windows с сетевого файлового сервера и запуска установки Windows. </p> <p align="justify">Среда Windows PE не предназначена для использования в качестве основной операционной системы на компьютере - она служит в качестве изолированной среды предустановки и является встроенным элементом других средств установки и восстановления системы, например программы установки для Windows 7, служб развертывания Windows (Windows DS), пакета средств развертывания операционной системы (OS) сервера SCCM и среды восстановления Windows (Windows RE).</p> <p align="justify">На данный момент последняя версия WinPE – это WinPE 3.0, построенная на ядре Windows 7. Подробнее о WinPE можно прочитать в стать &quot;<!--noindex--><a href="http://technet.microsoft.com/ru-ru/library/dd799308(WS.10).aspx" rel="nofollow">Что такое Windows РЕ?</a><!--/noindex-->&quot;. </p> <p align="justify">WinPE имеет определенные ограничения, в частности:</p> <ul><li>для минимизации размера среды Windows PE в нее включен только ограниченный набор интерфейсов программирования Win32;</li>
 <li><strong>среда Windows PE не поддерживает оболочку Microsoft .NET или среду CLR</strong>.</li>
 </ul> <p align="justify">Образ WinPE может быть кастомизирован. Это означает, что в него может быть добавлена поддержка:</p> <ul><li><font><span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 12pt">пользовательских</span> скриптов;</font></li>
 <li><div align="justify"><strong>разрешенных</strong> дополнительных пакетов, расширяющих стандартную функциональность WinPE. </div> </li>
 </ul> <p align="justify">Для получения более подробной информации смотрите стать &quot;<!--noindex--><a href="http://technet.microsoft.com/ru-ru/library/cc709665(WS.10).aspx" rel="nofollow">Краткое руководство: создание пользовательского образа Windows PE</a><!--/noindex-->&quot;, &quot;<!--noindex--><a href="http://technet.microsoft.com/ru-ru/library/cc766521(WS.10).aspx" rel="nofollow">Добавление специального сценария в образ Windows PE</a><!--/noindex-->&quot; и &quot;<!--noindex--><a href="http://technet.microsoft.com/ru-ru/library/cc749470(WS.10).aspx" rel="nofollow">Добавление пакета в образ Windows PE</a><!--/noindex-->&quot;.</p> <p align="justify">Из возможностей кастомизации нам с Вами могут быть интересны следующие:</p> <ul><li>пакет WinPE-HTA - это поддержка HTML-приложений, позволяющая создавать приложения с графическим интерфейсом пользователя, используя обработчик сценариев Internet Explorer и службы HTML;</li>
 <li>пакет WinPE-Scripting - это поддержка сервера сценариев Windows (WSH), позволяющая производить пакетную обработку файлов с помощью объектов сценариев WSH.</li>
 </ul> <p>Стоит отметить, что теперь (WinPE 3.0) пакет WinPE-XML входит в базовый файл boot.wim. WinPE-XML - это поддержка программы разбора Microsoft XML (MSXML).</p> <p>Теперь, когда мы больше знаем о возможностях WinPE, можем предложить следующий вариант решения поставленной задачи: </p> <ol><li>Перенос логики обращения к Active Directory на сторону выделенного сервера приложений. Т.к. на стороне сервера приложений нет ограничений по использованию .Net, то создадим WCF сервис, <span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 12pt">решающий</span> эту задачу. Для этого воспользуемся пространством имен System.DirectoryServices.AccountManagement (<!--noindex--><a href="http://msdn.microsoft.com/ru-ru/library/system.directoryservices.accountmanagement.aspx" rel="nofollow">API AccountManagement</a><!--/noindex-->), которое доступно в .Net 3.5. System.DirectoryServices.AccountManagement пришло на смены System.DirectoryServices, использовавшемуся в .Net 2.0.</li>
 <li>Использование MSXML для <span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 12pt">взаимодействия</span> с WCF сервисом: формирование SOAP запроса и получение/разбор SOAP ответа. Для этого будем использовать объект <strong><!--noindex--><a href="http://msdn.microsoft.com/ru-ru/library/ms762278(v=VS.85).aspx" rel="nofollow">ServerXMLHTTP</a><!--/noindex--></strong>. ServerXMLHTTP поддерживает как GET, так и POST. </li>
 <li>Организация общения через <strong>SSL</strong> (безопасность на уровне транспорта). С бизнес точки зрения это <span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 12pt">необходимо</span>, т.к. может WCF сервис может выполнять различные операции, например, некоторые из которых могут требовать аутентификации или принимать в качестве параметров конфиденциальные данные. С точки зрения технической - <span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 12pt">организовать</span> общение по SSL в данном случае будет проще, чем через безопасность на уровне сообщений (WS-Security), т.к. нам придется работать с SOAP практически напрямую. <strong><em>Примечание</em></strong>: в случае, если шифрование не <span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 12pt">требуется</span>, то можно вообще обойтись не SOAP WCF сервисом, а <strong>REST WCF сервисом</strong>, что будет еще проще.</li>
 </ol> <p>Код на стороне WCF сервиса</p> <p><div class="blog-code-box"><pre class="csharp">[ServiceContract]
public interface IActiveDirectory
{
    [OperationContract, WebInvoke(Method = &quot;POST&quot;, BodyStyle = WebMessageBodyStyle.Bare)]
    bool ValidateCredentials(Stream stream);
}
</pre></div></p> <p><div class="blog-code-box"><pre class="csharp">public bool ValidateCredentials(Stream stream)
{
    StreamReader reader = null;
    try
    {
        reader = new StreamReader(stream);
        NameValueCollection values = HttpUtility.ParseQueryString(reader.ReadToEnd(), Encoding.UTF8);
        PrincipalContext pc = new PrincipalContext(ContextType.Domain, values[&quot;domain&quot;]);
        return pc.ValidateCredentials(values[&quot;username&quot;], values[&quot;password&quot;]);
    }
    catch (System.Exception ex)
    {
        throw ex;

    }
    finally
    {
        if (reader != null)
            reader.Close();
    }
}</pre></div></p> <p><strong>Код на стороне WinPE</strong></p> <p><div class="blog-code-box"><pre class="jscript">Function ValidateCredentialsPOST(username, password, domain)
    Dim srvXmlHttp, docXML
    Set srvXmlHttp = CreateObject (&quot;MSXML2.ServerXMLHTTP.6.0&quot;)
    srvXmlHttp.setoption(2) = 13056 
    srvXmlHttp.Open &quot;POST&quot;,&quot;https://&lt;AppServerUrl&gt;/&lt;WcfServiceFile.svc&gt;/ValidateCredentials&quot;, False
    srvXmlHttp.setRequestHeader &quot;CharSet&quot;, &quot;UTF-8&quot;
    srvXmlHttp.setRequestHeader &quot;Content-Type&quot;, &quot;application/x-www-form-urlencoded&quot;
    srvXmlHttp.Send &quot;username=&quot; &amp; escape(username) &amp; &quot;&amp;password=&quot; &amp; escape(password) &amp; &quot;&amp;domain=&quot; &amp; escape(domain)
    Set docXML = CreateObject(&quot;MSXML2.DOMDocument.6.0&quot;)
    docXML.LoadXML (srvXmlHttp.ResponseXML.XML)
    ValidateCredentialsPOST = docXML.text
End Function</pre></div></p> <p>Обратите внимание на строку srvXmlHttp.setoption(2) = 13056. Она необходима, чтобы принять SSL сертификат сервера приложений, т.к. игнорировать ошибка проверки <span style="LINE-HEIGHT: 115%; FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 12pt">подлинности</span> сертификата. А так же на функцию escape, которая необходима для кодирования символов передаваемых параметров.</p>]]></description>
      <author><![CDATA[natale]]></author>
      <category><![CDATA[WCF]]></category>
      <guid isPermaLink="false">urn:bitrix:blog:post:7553</guid>
      <pubDate>Sun, 11 Apr 2010 07:40:19 UT</pubDate>
    </item>
    <item>
      <title><![CDATA[Новый Process Explorer v12]]></title>
      <link>http://www.gotdotnet.ru/blogs/natale/7465/</link>
      <description><![CDATA[<p align="justify">В новой версии известного приложения от Марка Руссиновича – <!--noindex--><a href="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx" rel="nofollow">Process Explorer v12</a><!--/noindex--> – появилась замечательная возможность получать информацию, специфичную для .Net приложений (для CLR среды, в которой выполняется .Net приложение). В частности показывать <strong>.Net CLR загруженные библиотеки</strong> и <strong>.Net счетчики производительности</strong>.</p> <p align="justify">.Net Assemblies</p> <p align="justify"><img src="http://www.gotdotnet.ru/upload/blog/natale/f76/NetAssemblies.jpg" border="0"/></p> <p align="justify">.Net Performance</p> <p align="justify"><img src="http://www.gotdotnet.ru/upload/blog/natale/a52/NetPerformance.jpg" border="0"/></p>]]></description>
      <author><![CDATA[natale]]></author>
      <category><![CDATA[.net]]></category>
      <guid isPermaLink="false">urn:bitrix:blog:post:7465</guid>
      <pubDate>Mon, 29 Mar 2010 16:11:01 UT</pubDate>
    </item>
  </channel>
</rss>