Web services 当WCF调用';这是一个单件,正在测试中运行

Web services 当WCF调用';这是一个单件,正在测试中运行,web-services,wcf,debugging,Web Services,Wcf,Debugging,我自己主持一个双工合同,WCF服务。 在编写一个测试来测试我的客户机是否从服务接收消息时,我发现我无法调试服务本身。 因此,我举了一个简单的例子,似乎可以帮助我重复这个问题。 这是我正在尝试的测试的一个示例: [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { ServiceRunner.Run(null); var client = n

我自己主持一个双工合同,WCF服务。 在编写一个测试来测试我的客户机是否从服务接收消息时,我发现我无法调试服务本身。 因此,我举了一个简单的例子,似乎可以帮助我重复这个问题。 这是我正在尝试的测试的一个示例:

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        ServiceRunner.Run(null);
        var client = new ServiceReference1.Service1Client();
        var result = client.GetData(11);
        Assert.IsNotNull(result);
        ServiceRunner.Host.Close();
    }
}
ServiceRunner将以单件形式托管WCF合同。客户端来自指向自托管服务的服务引用。当我调用GetData(11)时,我得到一个响应,只是服务中的断点从未被击中。 为什么呢

以下是完整性服务的实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Text;

namespace CanYouDebugThis
{

    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string GetData(int value);
    }

    [ServiceBehaviorAttribute(InstanceContextMode = InstanceContextMode.Single)]
    public class Service1 : IService1
    {
        public string GetData(int value)
        {
            Console.WriteLine($"Get data with {value}");
            return string.Format("You entered: {0}", value);
        }
    }

    public class ServiceRunner
    {
        public static ServiceHost Host;
        public static void Run(String[] args)
        {
            var serviceInstance = new Service1();
            Uri baseAddress = new Uri("http://localhost:8080/hello");

            Host = new ServiceHost(serviceInstance, baseAddress);
            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();

            smb.HttpGetEnabled = true;
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
            Host.Description.Behaviors.Add(smb);
            Host.Open();
        }
    }
}

托管服务有问题。我们应该添加用于交换元数据的服务端点和MEX端点。请参考以下代码段

public static ServiceHost Host;
        public static void Main(String[] args)
        {
            var serviceInstance = new Service1();
            Uri baseAddress = new Uri("http://localhost:8080/hello");
            BasicHttpBinding binding = new BasicHttpBinding();
            //Host = new ServiceHost(serviceInstance, baseAddress);
            Host = new ServiceHost(typeof(Service1), baseAddress);
            Host.AddServiceEndpoint(typeof(IService1), binding, "");

            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
            Host.Description.Behaviors.Add(smb);

            Binding mexbinding = MetadataExchangeBindings.CreateMexHttpBinding();
            Host.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");
            Host.Open();
            Console.WriteLine("Service is ready...");
            //pause, accepting a word would teminate the service.
            Console.ReadLine();
            Host.Close();
            Console.WriteLine("Service is closed....");
        }
请先在单个控制台项目中托管服务。然后在客户端,我们通过添加服务引用来生成客户端代理。请注意自动生成的服务端点,应该与实际的服务端点对应。
结果。

如果有什么我可以帮忙的,请随时告诉我。
已更新。

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        ServiceRunner.Run(null);
        ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
        var result = client.GetData(34);
        Assert.IsNotNull(result);
    }
}
[ServiceContract]
public interface IService1
{
    [OperationContract]
    string GetData(int value);
}

[ServiceBehaviorAttribute(InstanceContextMode = InstanceContextMode.Single)]
public class Service1 : IService1
{
    public string GetData(int value)
    {
        Console.WriteLine($"Get data with {value}");
        return string.Format("You entered: {0}", value);
    }
}

public class ServiceRunner
{
    public static ServiceHost Host;
    public static void Run(String[] args)
    {
        var serviceInstance = new Service1();
        Uri baseAddress = new Uri("http://localhost:8080/hello");

        Host = new ServiceHost(serviceInstance, baseAddress);
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();

        smb.HttpGetEnabled = true;
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
        Host.Description.Behaviors.Add(smb);
        Host.Open();
    }
}
结果。


最后,请注意自动生成的客户端端点地址。

我认为您没有回答这个问题。我可以很好地主持这项服务。它在测试中运行,并生成通过的结果。我只是无法调试我在测试本身中托管的服务,以便我可以跟踪从测试中到服务中的调用。是的,在测试您的托管后,服务运行良好。在UnitTest项目中,进入调试模式与普通项目不同。右键单击项目,然后单击“调试测试”。关于项目的结构,请参考我的最新回复。要清楚,我对调试测试项目或一般项目没有问题。我试图调试一个WCF自托管服务,我想在单元测试中启动它。这就好像我知道正在执行的调用是在调试器之外发生的,即使进程是在调试器内启动的。