WCF服务主机的单元测试在TFS集成构建中失败

4

我有一个与在TFSBuild的集成构建中创建WCF ServiceHost实例相关的问题。在单元测试中使用的代码如下:

[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 Build Server的情况下,启动构建的用户称为TFSBuild,是Domain Users的成员,并且是TFS Build Server中的本地管理员。

在Build Server上执行相同的单元测试会引发以下异常:

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来公开一些报告和Web,因此我将WCF服务要使用的端口更改为8001。即使以前使用端口80也没有起作用。
有没有在TFS构建服务器上运行此测试的选项?我是否需要在我的构建中配置任何额外的内容?
就提供最有用信息而言,所使用的系统如下:
- Dev Machines: VS2010TS, Windows 7RTM - Server Machines: TFS2010, Windows Server 2008 R2 RTM
感谢您的时间和支持。
最好的问候, 米格尔。
3个回答

2
这听起来像是UAC的问题。即使您的TFSBuild帐户是本地管理员,该进程也不会具有管理员权限,除非显式配置为具有该权限。
我在我的本地机器上(Vista x64)遇到过这个问题很多次,它总是与缺乏管理员权限有关。我无法告诉您为什么它可以在您的开发框中的非管理员模式下工作,但是我也不知道Win7在这方面如何工作。
使用管理员特权运行进程的替代方法是使用netsh提前配置端口

2

+1 我来这里发布同样的工具。如果它有效,请告诉我们。 - Richard Berg
谢谢,这个完美地解决了我的问题...但现在我必须在创建应用程序的安装设置时考虑它。我可以尝试切换到NetTcp以避免这个问题。以管理员身份运行应用程序也不是一个选项。 - user172034

0

异常发生在系统尝试注册URL时。

该URL已经使用WAS(Windows Activayion Services)进行注册。可能是WAS没有设置的问题。

事件日志中可能会有更详细的帮助信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接