客户端服务集成测试中的CommunicationException

时间:2018-09-20 06:26:01

标签: c# wcf integration-testing azure-pipelines

我正在为WCF服务进行集成测试,其中测试客户端正在向自托管服务发出请求。

我的WCF服务设置:

var binding = new BasicHttpBinding {Security = {Mode = BasicHttpSecurityMode.Transport}};
var endpointAddress = new EndpointAddress("https://localhost:44398/MyService.svc");
var host = new ServiceHost(typeof(MyService), endpointAddress.Uri);
host.AddServiceEndpoint(typeof(WcfServices.Contracts.IMyService),
binding, endpointAddress.Uri);
host.Open();

我的客户打来电话

var client = new MyServiceClient(binding, endpointAddress);

// Act

Contract.MyResult result;
try
{
    result = actMethod.Invoke(sut);
}
finally
{
    client.Close();
    if (host.State == CommunicationState.Opened)
        host.Close();
    else
        host.Abort();
}

在执行测试之前,我运行以下PowerShell脚本:

$whoami = WHOAMI
netsh http add urlacl url=https://+:44398/MyService.svc/ user=$whoami

一切在我的本地计算机上都可以正常工作,但是当它是在Azure DevOps中使用我的管道构建的,并且涉及到运行此特定测试时,我得到:

  

System.ServiceModel.CommunicationException:向https://localhost:44398/MyService.svc发出HTTP请求时发生错误。这可能是由于在HTTPS情况下未使用HTTP.SYS正确配置服务器证书。这也可能是由于客户端和服务器之间的安全绑定不匹配造成的。

     

---- System.Net.WebException:基础连接已关闭:发送中发生意外错误。

     

-------- System.IO.IOException:无法从传输连接读取数据:现有连接被远程主机强行关闭。

     

------------ System.Net.Sockets.SocketException:远程主机强行关闭了现有连接

此外,我尝试将其添加到测试中:

if (ServicePointManager.SecurityProtocol == (SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls))
    ServicePointManager.SecurityProtocol =
        SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

没有任何改变。

我知道这可能与我从未在管道中使用任何证书有关,尽管我想知道为什么那时在我的本地计算机上没有证书就可以工作。另外,我真的不知道如何在管道中正确设置一个。有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

确保使用以下标记正确指定配置,

<serviceBehaviors>
      <behavior name="nameofBehaviour">
        <serviceMetadata httpsGetEnabled="true"/>
      </behavior>
    </serviceBehaviors>

此外,您可以尝试在代码中添加以下几行。

System.Net.ServicePointManager.SecurityProtocol =
 System.Net.SecurityProtocolType.Tls12;

System.Net.ServicePointManager.SecurityProtocol =
   System.Net.SecurityProtocolType.Tls12 | Tls1.1 | Tls1.0