单元测试 WCF 服务时,AddressAccessDeniedException“您的进程没有访问此命名空间的权限”

Posted

技术标签:

【中文标题】单元测试 WCF 服务时,AddressAccessDeniedException“您的进程没有访问此命名空间的权限”【英文标题】:AddressAccessDeniedException "Your process does not have access rights to this namespace" when Unit testing WCF service 【发布时间】:2013-01-11 21:09:09 【问题描述】:

我正在测试我的 WCF 服务,但我需要伪造该行为,因为我的服务是使用自定义工厂引导的。 这是我为测试编写的代码:

var channelFactory = new ChannelFactory<IDomainWriteService>(
   new CustomBinding(
      new BinaryMessageEncodingBindingElement(), 
      new HttpTransportBindingElement()),
   new EndpointAddress(new Uri("local")));
var service = channelFactory.CreateChannel();

我有一个测试初始化​​,它正在创建一个新的 ServiceHost:

internal static void StartService()

    Instance = new ServiceHost(typeof (DomainWriteService));
    Instance.Open();

我通过以下方式在我的 MsTest 项目中配置了一个假端点:

<service name="xxx.DomainWriteService">
  <endpoint binding="basicHttpBinding" bindingConfiguration=""
    name="local" bindingName="http" contract="xxx.IDomainWriteService" />
  <host>
    <baseAddresses>
      <add baseAddress="http://xxx/service" />
    </baseAddresses>
  </host>
</service>

但是当我运行我的测试时,我得到了这个运行时错误:

    Class Initialization method xxx.ClassInitialize threw exception. System.ServiceModel.AddressAccessDeniedException: 
System.ServiceModel.AddressAccessDeniedException: 
HTTP could not register URL **http://+:80/service/**. 
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.

我在 Windows 8 上

【问题讨论】:

是的,它对我有用。 【参考方案1】:

您需要使用netsh add urlacl 来允许侦听进程的访问,以便能够在端口 80 上接收,(或与其他侦听器共享端口 80)

netsh http add urlacl url=http://+:80/service user=YOURUSER

其中YOURUSER 是运行侦听器的进程的凭据,例如DOMAIN\User

另请参阅:WCF ServiceHost access rights

【讨论】:

注意尾随斜杠在注册时很重要,否则你会得到一个错误 87: netsh http add urlacl url=http://+:12345/ user=domain\username 注意 /在 12345 的末尾!

以上是关于单元测试 WCF 服务时,AddressAccessDeniedException“您的进程没有访问此命名空间的权限”的主要内容,如果未能解决你的问题,请参考以下文章

如何对我的 WCF 客户端类进行单元测试?

WCF 单元测试

如何对 WCF UriTemplates 进行单元测试?

串行执行单元测试(而不是并行)

将数据注入 WCF 服务

找不到端点异常 - WCF Web 服务