如何从Windows服务以编程方式调用WCF方法

时间:2014-09-07 08:43:01

标签: 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/

我正在使用以下代码从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服务后如何在任何表单的button_click事件上调用WCF函数。我只是想以编程方式启动Windows服务。

编辑: 我的DoJobs()中的代码使用DDE Client获取firefox的活动标签页,只有在Windows服务项目中执行但运行时才会引发异常在WCF项目中完成时成功。请参阅this for reference。 所以我使用从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()吗?或者还有其他一些解决方案。

非常感谢任何帮助。

感谢。

2 个答案:

答案 0 :(得分:0)

假设你有:

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

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

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

答案 1 :(得分:0)

这是我对你的帖子和Noctis的回答所做的各种评论的总体答案(特别是我们不知道你在OP中使用了DDE):

您无法在Windows服务中使用动态数据交换(DDE),因为后者没有消息泵。此外,DDE需要将Window句柄作为参数传递给DDE函数。您可以在具有消息泵的程序中使用DDE作为 WinForms 应用程序。 See this article for more information

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

现在可能会出现这样的情况:您可以将消息泵添加到Windows服务但我不推荐它,因为它属于类别,因为您可以做某件事,并不意味着您应该做一件事。另一个话题。它与最近关于如何在控制台应用程序中显示 WinForm 的SO问题非常相似 - 默认情况下,您无法做到这一点,如果您设法最终得到奇怪的混合有很多重新发明的车轮。更不用说它是一个丑陋的黑客

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