C# 如何从windows服务以编程方式调用WCF方法

C# 如何从windows服务以编程方式调用WCF方法,c#,.net,web-services,wcf,windows-services,C#,.net,Web Services,Wcf,Windows Services,我已使用WCF成功编译并运行Windows服务。使用installutil,Windows服务将成功安装并启动。我想我的开发已经结束,只需要在WCF中调用方法DoJobs()。我不需要任何用户交互,因此我没有任何Windows窗体或任何东西。我只想在serviceHost.Open()之后以编程方式调用我的WCF函数 app.config文件中的基址为 http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/

我已使用WCF成功编译并运行Windows服务。使用installutil,Windows服务将成功安装并启动。我想我的开发已经结束,只需要在WCF中调用方法
DoJobs()
。我不需要任何用户交互,因此我没有任何Windows窗体或任何东西。我只想在
serviceHost.Open()之后以编程方式调用我的WCF函数

app.config
文件中的基址为

http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/
我正在使用以下代码从Windows服务部署WCF

// Create a ServiceHost for the CalculatorService type and provide the base address.
serviceHost = new ServiceHost(typeof(WcfServiceLibrary1.Service1));

// Open the ServiceHostBase to create listeners and start listening for messages.
serviceHost.Open();
我还添加了服务引用并创建了下面的代理,但不确定它的用途

WcfServiceLibrary1.WCFServiceRef.Service1Client
我已经搜索了教程,示例显示了如何在运行Windows服务后在
按钮(单击
任何形式的事件)上调用WCF函数。我只想在Windows服务启动时以编程方式执行此操作

编辑:my DoJobs()中的代码获取firefox with DDE Client的活动选项卡url,该选项卡仅在Windows服务项目中执行时引发异常,但在WCF项目中执行时成功运行。请看。 因此,我使用从Windows服务调用的WCF制作了一个C#.Net解决方案,然后在Windows服务中调用DoJobs(),如下所示

WcfServiceLibrary1.WCFServiceRef.Service1Client wcfObj = null;
...
protected override void OnStart(string[] args)
{
    if (serviceHost != null)
    {
        serviceHost.Close();
    }

    serviceHost = new ServiceHost(typeof(WcfServiceLibrary1.Service1));
    serviceHost.Open();

    if (wcfObj == null)
    {
        wcfObj = new WcfServiceLibrary1.WCFServiceRef.Service1Client();
        wcfObj.DoJobs();
    }
}
但是,它使调用发生在windows服务层,并引发相同的DdeClient异常

基址url是否有助于以编程方式调用Web服务中的DoJobs()?或者还有其他一些解决方案

非常感谢您的帮助

谢谢。

假设您有:

// I'm assuming this is your proxy?
var proxy = WcfServiceLibrary1.WCFServiceRef.Service1Client; 

// All you need to do is :
proxy.DoJobs() ;


看到你的更新和Micky的答案后,我想知道你为什么要使用DDE。不确定您的要求是什么,但您可以始终使用MSMQ发送消息和排队。

这是我对您的帖子和Noctis的答案(特别是我们不知道您在OP中使用DDE)的各种评论的汇总答案:

无法在Windows服务中使用动态数据交换(DDE),因为后者没有消息泵。DDE还要求将窗口句柄作为参数传递给DDE函数。您可以在具有消息泵的程序中使用DDE作为WinForms应用程序

一旦GUI应用程序运行,您可以将其最小化为系统托盘图标,或者完全隐藏应用程序,以便用户不知道。无论DDE的可视性如何,使用DDE都应该没有问题,因为它会有一个消息泵

现在,您可能可以在Windows服务中添加消息泵,但我不推荐它,因为它属于这样的类别:因为您可以做一件事,但并不意味着您应该做一件事。下次的话题。这与最近一个关于如何在控制台应用程序中显示WinForm的SO问题非常相似——默认情况下,你不能,如果你成功地做到了,那么你最终会得到一辆奇怪的混合动力车,并对轮子进行了大量的重新发明。更不用说它是一个丑陋的黑客


总之,我的最佳建议是继续使用GUI应用程序。

您是说希望Windows服务实际上调用它所承载的WCF服务(调用自身)还是客户端进程调用WCF服务(外部进程)?我没有类似win form的东西可以调用,所以我认为OnStart()Windows服务的方法是唯一可以在serviceHost之后通过代码调用wcf DoJobs()的地方。Open()是的,假设您的wcf服务有一个名为
DoJobs()
的方法,那么我建议您不要在Windows服务中使用动态数据交换(DDE),因为后者没有消息泵。您可以在具有消息泵作为GUI的程序中使用DDE。非常感谢你的帮助。米奇,这是唯一的解决办法吗?我真的希望有更好的解决办法。在这种情况下,我需要添加一个使用WCF DoJobs()方法的win form项目,并在serviceHost.Open()之后从Windows Service OnStart()调用win form。为了使它静音或不可见,我还需要在启动时通过C#代码隐藏win表单。我说得对吗?早些时候我就这么做了。它调用函数,但使调用发生在windows服务层,这是我不想要的。my DoJobs()中的代码获取firefox with DDE Client的活动选项卡url,该url在windows服务中引发异常,但在wcf中分别成功运行。请参见此以供参考()。我是否应该以某种方式以编程方式公开基址并调用DoJobs()。请帮助。@Biswa您是否可以更新您的问题以反映此评论。很难确切知道您的情况是什么Noctis,我认为第一行应该是
var proxy=new WcfServiceLibrary1.wcfservicerf.Service1Client()
?@MickyDuncan,谢谢您的建议,我已经编辑了这个问题。@MickyDuncan,可能吧。我不知道他是如何实例化或创建它的,但他肯定需要那里的
()
。可能也是一个新的。我试过了,但是运气不好。我也处在同样的位置。Windows服务将不允许调用窗体来显示或执行Process.Start()来启动win form exe。Windows服务中的Process.Start()也抛出与前面相同的DdeClient异常,因为my DoJobs()方法现在位于win form构造函数中。请看。解决办法是什么?我现在该怎么办?请帮忙,我不是这么说的。不要试图在Windows服务(WS)中显示
WinForm
或使用DDE,也不要从WS生成交互式子进程。为什么?因为如果用户未登录,生成的GUI应用程序可能无法运行。相反,正如我们所讨论的,当您制作“不可见”的GUI应用程序时,根本不需要WS,并且要求用户必须登录。好的,是的,我明白。但我需要我的应用程序在每次我的comp