2011-09-26

Discovery New Release!

В пятницу были обновлены сервисы DiscoveryProxy на обоих серваках, а также добавлена в SVN новая библиотека работы c ним (DiscoveryUtils.dll).
Новые адреса:
http://srv08/Discovery/DiscoveryProxyService.svc
http://192.168.4.1/Discovery/DiscoveryProxyService.svc

Как сделать свой сервис видимым в Discovery: 
1. Добавить Reference на System.ServiceModel.Discovery
2. Добавить Reference на DiscoveryUtils
3. Перед интерфейсом контракта добавить атрибут [MataDataBehavior]

    [ServiceContract]
    [MetaDataBehavior]
    public interface ITestService
    {
        [OperationContract]
        string GetData(int value);
        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);     
    }

4. Задать привязку WSHttpBinding без шифрования:

<bindings>
      <wsHttpBinding>
        <binding name="NoSecure">
          <security mode="None"/>
        </binding>
      </wsHttpBinding>
    </bindings>


5. В конфиге к сервису добавить поведение, содержащее секцию DiscoveryService (указывайте вашу привязку и реальный адрес Discovery):
<serviceDiscovery>
            <announcementEndpoints>
                 <endpoint address="http://localhost/Discovery/DiscoveryProxyService.svc"
                              binding="wsHttpBinding" bindingConfiguration="NoSecure"          
                              kind="announcementEndpoint">
                 </endpoint>
            </announcementEndpoints>
</serviceDiscovery>
Все готово: ваш сервис отсылает информацию о себе Discovery, в том числе и информацию о привязке.

Как пользоваться Discovery для поиска сервисов:
1. Добавить ссылки на System.ServiceModel.Discovery и DiscoveryUtils.
2. C помощью ServiceReference получить метаданные контракта.
2. В секции AppSettings Вашего конфига прописать адрес DiscoveryProxy:

  <appSettings>
    <add key="DefaultDiscoveryProxyAddress"      
             value="http://localhost/Discovery/DiscoveryProxyService.svc" /> 
  </appSettings>

3. Получить экземпляр интерфейса IDiscoveryAgent:
  var agent = DiscoveryAgent.Instance;
4. Получить  экземпляр необходимого Вам сервиса:
  IService qqq = agent.GetClient<IService>();

Радоваться жизни!
Во время разработки можно вместо DiscoveryAgent использовать ConfigurationAgent - этот класс берет адреса сервисов прямо из Вашего конфига, не обращаясь к Discovery. Они имеют общий интерфейс IDiscoveryAgent.









2011-06-02

NLog для самых частых нужд: file, console, coloredConsole, logViewer

Порывшись в документации по NLog и форумах, написал для себя наиболее типичную конфигурацию NLog.

  • В ней содержатся следующие таргеты: консоль, цветная консоль, файл и удаленный просмотрщик логов (например, log2console).
  • Для задания layouts и других параметров используются переменные, так что править теперь нужно только в одном месте.
  • Удалось также вывести exception для удаленного просмотрщика: он задается отдельным параметром и становится виден в окне Details.
  • Удалось выяснить, как разделять поля exception переводом строки: достаточно задать символы как &#13;&#10;
  • Для ускорения работы кода: <targets async="true">

<?xml version="1.0" encoding="utf-8" ?>

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      throwExceptions="false">

  <!-- Exception layout -->
  <variable name="excLayout" value="${exception:format=Type,Message,StackTrace:separator=&#13;&#10;}"/>

  <!-- Message layout -->
  <variable name="msgLayout" value="${longdate} [${level}] ${logger}: ${message}"/>

  <!-- Full layout (msgLayout + excLayout) -->
  <variable name="fullLayout" value="${msgLayout}  ${excLayout}" />

  <!-- Address for logViewer target -->
  <variable name="viewerAddress" value="tcp4://localhost:4505" />

  <!-- File name pattern -->
  <variable name="fileName" value="${basedir}logs/log.txt" />

  <targets async="true">

    <!-- Simple console target -->
    <target name="console" xsi:type="Console" layout="${fullLayout}" />

    <!-- Colored console target -->
    <target name="coloredConsole" xsi:type="ColoredConsole" layout="${fullLayout}"/>

    <!-- File layout -->
    <target name="file" xsi:type="File" layout="${fullLayout}" fileName="${fileName}" createDirs="true" />

    <!-- LogViewer target (for log2console) -->
    <target name="logViewer" xsi:type="NLogViewer" address="${viewerAddress}">
      <parameter name="exception" layout="${excLayout}"/>
    </target>
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="logViewer,file" />
  </rules>
</nlog>