C# 使用WCF通过Windows服务和Windows窗体应用程序进行通信
目前,我在Visual Studio 2017中有两个解决方案:C# 使用WCF通过Windows服务和Windows窗体应用程序进行通信,c#,winforms,wcf,windows-services,C#,Winforms,Wcf,Windows Services,目前,我在Visual Studio 2017中有两个解决方案: Windows窗体应用程序 承载WCF服务类库(.dll)的Windows服务应用程序 我需要在他们之间以循环的方式交流,如下图所示。数字代表顺序 问题是,我实际上能够通过使用请求重播操作契约(由数字1和4表示)在WF和WCF应用程序之间进行通信。但我不知道如何完成第2步和第3步 WCF接口代码: namespace SmithWcfService { [ServiceContract] public inter
namespace SmithWcfService {
[ServiceContract]
public interface ISmithWcfService {
[OperationContract]
void SendRequest( ); //Operation called by Windows Forms
}
}
WCF接口实现代码
namespace SmithWcfService {
public class SmithWcfService : ISmithWcfService {
public void SendRequest( ) {
//Ok, now I need to call Windows service application
}
}
}
Windows服务代码
namespace SmithWindowsService {
static class Program {
static void Main( ) {
ServiceBase[ ] ServicesToRun;
ServicesToRun = new ServiceBase[ ] {
new SmithWindowsService( )
};
ServiceBase.Run( ServicesToRun );
}
}
}
namespace SmithWindowsService {
public partial class SmithWindowsService : ServiceBase {
private ServiceHost host;
public SmithWindowsService( ) {
InitializeComponent( );
}
protected override void OnStart( string[ ] args ) {
host = new ServiceHost( typeof( SmithWcfService.SmithWcfService ) );
host.Open( );
}
}
}
如果windows服务承载您的WCF服务,您只需在服务启动时传递它所需的任何内容(回调、值、设置)。您可以将windows服务的方法传递为WCF服务应该调用的
Func
没有你的代码,你很难知道你需要把它放在哪里。通常,它会进入您的自定义服务主机工厂
带有回调的服务示例:
namespace SmithWcfService
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class SmithWcfService : ISmithWcfService
{
private Func<string, int> callback;
public SmithWcfService(Func<string, int> callback)
{
this.callback = callback;
}
public void SendRequest()
{
//Ok, now I need to call Windows service application:
var output = this.callback("input");
}
}
}
在什么意义上,您试图在WCF服务和windows服务之间进行通信呢?嗯,WCF基本上是围绕传输机制的一个抽象层。您定义了需要交换的数据,它负责如何交换这些数据。因此,使用WCF在前端应用程序和Windows服务之间进行通信完全没有问题@Buggfinder那么你自己的问题是沉默的!我问你对2和3的期望是什么,你刚才说你可以做到。。。交换自定义数据。从1到2的相同类型。谢谢您的回复。添加了更多代码。你能给我提供更多的解释吗?你能发布你托管WCF服务的部分吗?@JoséAugustinho添加了一个通过普通函数调用与托管WCF服务通信的示例。
namespace SmithWindowsService
{
public partial class SmithWindowsService : ServiceBase
{
private ServiceHost host;
public SmithWindowsService( )
{
InitializeComponent( );
}
protected override void OnStart(string[] args)
{
var instance = new SmithWcfService.SmithWcfService(this.SomeMethodYouWantToCallIn);
host = new ServiceHost(instance, new Uri("your.url.com"));
host.Open( );
}
private int SomeMethodYouWantToCall(string data)
{
// do things...
}
}
}