Модульное тестирование WCF ServiceHost завершается с ошибкой в ​​интеграционной сборке TFS - PullRequest
4 голосов
/ 11 сентября 2009

У меня есть проблема, связанная с созданием экземпляра WCF ServiceHost с набором модульных тестов и проектом, встроенным в интеграционную сборку в TFSBuild. Код, использованный в модульном тесте:

[TestMethod]
public void Service_Can_Be_Dynamically_Hosted()
{
    ServiceHost host = new ServiceHost(typeof(DiscoveryService));

    host.Open();
    host.Close();
}

Конфигурация для службы, хотя она может быть создана непосредственно с помощью кода, находится в файле .config, содержащем следующую информацию:

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="TappingBoard.Core.Network.DiscoveryServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <services>
      <service behaviorConfiguration="TappingBoard.Core.Network.DiscoveryServiceBehavior"
               name="TappingBoard.Core.Network.Services.DiscoveryService">
        <endpoint address="" binding="wsHttpBinding" contract="TappingBoard.Core.Network.Services.IDiscoveryService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8001/TappingBoard/DiscoveryService/" />
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>

Модульный тест прекрасно работает на клиентских машинах, причем как локальные, так и не администраторские пользователи выполняют тесты. В случае сервера сборки TFS пользователь, запускающий сборку, называется TFSBuild и является членом группы пользователей домена и локальным администратором на сервере сборки TFS.

Выполнение того же модульного теста на сервере сборки запускает следующее исключение:

System.ServiceModel.AddressAccessDeniedException: HTTP could not register URL http://+:8001/TappingBoard/DiscoveryService/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details). ---> System.Net.HttpListenerException: Access is denied

Поскольку сервер сборки TFS использует порт 80 для предоставления некоторых отчетов и веб-сайтов через IIS, я изменил порт, который будет использоваться службой WCF, на 8001. Ранее он также не работал с портом 80.

Есть ли возможность запустить этот тест на сервере сборки TFS? Должен ли я настроить что-нибудь дополнительное в моей сборке?

В плане предоставления наиболее полезной информации используются следующие системы:

  • Dev Machines: VS2010TS, Windows 7RTM
  • Серверные машины: TFS2010, Windows Server 2008 R2 RTM

Заранее спасибо за ваше время и поддержку.

Bests, Мигель.

Ответы [ 3 ]

2 голосов
/ 11 сентября 2009

была такая же проблема некоторое время назад.
Решение, которое я использую, состоит в том, чтобы вручную зарегистрировать пространство имен http один раз. У Пола Уилера есть отличный инструмент для этого: HttpNamespaceManager

так из вашего кода: зарегистрируйте "http://localhost:8001/TappingBoard/DiscoveryService/" и дайте пользователю, который запускает модульные тесты полный доступ.

надеюсь, это поможет!

2 голосов
/ 11 сентября 2009

Это звучит как проблема с UAC. Даже если ваша учетная запись TFSBuild является локальным администратором, процесс не будет иметь привилегий администратора, если он явно не настроен для этого.

Я много раз сталкивался с этой проблемой на своем локальном компьютере (Vista x64), и это всегда было связано с отсутствием прав администратора. Я не могу сказать вам, почему он работает в режиме без прав администратора на ваших устройствах разработчика, но опять же я не знаю, как работает Win7 в этом отношении.

Альтернативой запуску процесса с правами администратора является предварительная настройка порта с использованием netsh .

0 голосов
/ 11 сентября 2009

Исключение происходит, когда система пытается зарегистрировать URL.

URL-адрес зарегистрирован в WAS (Windows Activayion Services). Может быть проблема в том, что WAS не настроен.

Может быть более полезное сообщение в журнале событий.

...