我想托管一个WCF服务(使用TCP),所以我写了这段代码:
ServiceHost myServiceHost = null;
// Create the binding.
NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.None;
//binding.Security.Transport.ClientCredentialType =
// TcpClientCredentialType.Windows;
// Create the URI for the endpoint.
Uri netTcpUri = new Uri("net.tcp://localhost:8008/MyService");
// Create the service host and add an endpoint.
myServiceHost = new ServiceHost(typeof(MyService), netTcpUri);
myServiceHost.AddServiceEndpoint(typeof(WcfServiceLibrary1.IMyService), binding, "");
// Open the service.
myServiceHost.Open();
此代码在我的网络中的计算机之间的控制台应用程序中正常工作。
现在我创建了一个Windows服务项目,将服务定义为LocalSystem
,这是我的服务开始/停止:
public partial class MyService : ServiceBase
{
ServiceHost myServiceHost = null;
public MyService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
if (myServiceHost != null)
myServiceHost.Close();
// Create the binding.
NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.None;
//binding.Security.Transport.ClientCredentialType =
// TcpClientCredentialType.Windows;
// Create the URI for the endpoint.
Uri netTcpUri = new Uri("net.tcp://localhost:8008/MyService");
// Create the service host and add an endpoint.
myServiceHost = new ServiceHost(typeof(MyService), netTcpUri);
myServiceHost.AddServiceEndpoint(typeof(WcfServiceLibrary1.IMyService), binding, "");
// Open the service.
myServiceHost.Open();
//Console.WriteLine("Listening...");
//Console.ReadLine();
// Close the service.
//myServiceHost.Close();
}
protected override void OnStop()
{
if (myServiceHost != null)
{
myServiceHost.Close();
myServiceHost = null;
}
}
}
正如您所看到的,我将连接创建代码放在我的服务开始中。
现在,在我成功安装服务后,尝试从Windows服务启动时出现此错误:
本地计算机上的服务启动和停止,如果某些服务未被其他服务或程序使用,则会自动停止
我多次尝试并一次又一次地收到这个错误。
我也尝试删除连接创建并尝试安装服务并在没有此代码的情况下启动,现在服务已启动,因此这里看起来有些问题而且我不知道为什么(不要这样做)忘记这个代码在控制台项目下工作,所以它没有注意到这段代码是好的)
我尝试 - 捕获并在文本文件中写入消息,所以现在服务已成功启动,这是错误消息:
合同名称' WcfServiceLibrary1.IMyService'无法在服务实施的合同列表中找到' WindowsService1.MyService'。
WcfServiceLibrary1
是我的WCF服务库项目,IMyService
存在,现在我的客户端无法连接到我的服务,尽管服务正在运行
MyService
和IMyService
:
[ServiceContract]
public interface IMyService
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: Add your service operations here
}
public class MyService : IMyService
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite == null)
{
throw new ArgumentNullException("composite");
}
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
答案 0 :(得分:0)
因为您的Service类是MyService,而您的WCF类是MyService,并且您没有使用命名空间编写完整的类名
myServiceHost = new ServiceHost(typeof(WcfServiceLibrary1.MyService), netTcpUri);
myServiceHost.AddServiceEndpoint(typeof(WcfServiceLibrary1.IMyService),
或更好的方法是重命名WindowsService类...