我已成功使用WCF编译和运行Windows服务。使用installutil,Windows服务已成功安装并启动。我想我正处于开发的最后阶段,只需要在WCF中调用/调用方法DoJobs()
。我不需要任何用户互动,所以我没有任何Windows表单或任何东西。我只想在serviceHost.Open();
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()吗?或者还有其他一些解决方案。
非常感谢任何帮助。
感谢。
答案 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应用程序。