Web services 当WCF调用';这是一个单件,正在测试中运行
我自己主持一个双工合同,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
[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自托管服务,我想在单元测试中启动它。这就好像我知道正在执行的调用是在调试器之外发生的,即使进程是在调试器内启动的。