【发布时间】:2011-02-21 20:31:47
【问题描述】:
我正在为在同一台服务器上运行的一组应用程序开发软件解决方案。
应用程序松散相关,并共享一个事件日志。我们遇到的问题是性能问题,每个应用程序在每次需要记录事件时都会调用数据库。
我正在尝试做的是通过删除应用程序对数据库的直接调用来解耦整个过程,并通过机器上运行的服务路由它们,该服务的唯一目的是处理来自机器上多个应用程序的事件。
最终我的目标是在“事件”帮助对象中实现某种系统,允许这些对象直接与“事件”服务通信。
我的第一直觉是使用典型的“事件”,但从我所做的研究来看,不可能在一个进程中调用事件以在另一个进程中处理。
作为我研究的一部分,我遇到了Listen for events in another application 和C# Win32 messaging with SendMessage。
Sendmessage 看起来是一个很有前途的解决方案,但我想确定一下,所以我与一位与该项目关系密切的同事(在此项目完成之前被转移到新项目的原始开发人员)进行了交谈,并且他提供了一些有关情况的补充信息。他们显然已经尝试使用 WCF 并将其构建为 Web 服务。除了服务器本身的位置和安全级别之外,这可能会起作用。
他认为有可能在操作系统级别实现 WCF 系统,而不必在 Web 服务环境中使用它。
我的问题是......“是否可以在操作系统级别使用 WCF?”和“在这种情况下,列出的哪些选项最有效?”请记住,这必须解耦,并且应用程序不能与数据库本身的事件日志进行任何交互。
WCF 更新:
所以我开始把一些东西放在一起,这就是我想出的..
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace SelfHost
{
[ServiceContract]
public interface ISelfHostingService
{
[OperationContract]
string SelfHost(string name);
}
public class SelfHostingService : ISelfHostingService
{
public string SelfHost(string name)
{
return string.Format("Hello, {0}", name);
}
}
class Program
{
static void Main(string[] args)
{
Uri baseAddress = new Uri("http://localhost:8080/SelfHost");
ServiceHost host = new ServiceHost(typeof(SelfHostingService), baseAddress);
host.AddServiceEndpoint(typeof(SelfHost.ISelfHostingService), new BasicHttpBinding(), baseAddress);
host.Open();
Console.WriteLine("The service is ready at {0}", baseAddress);
Console.WriteLine("Press <Enter> to stop the service.");
Console.ReadLine();
}
}
}
但是有一个问题。这一行:
Uri baseAddress = new Uri("http://localhost:8080/SelfHost");
我保证服务器不会允许服务注册该本地地址(它已经尝试过,但失败了)。
所以我的新问题是……“有没有一种不涉及更改服务器本身的配置设置的方法?”
MSMQ 更新:
这绝对是一个选项,但是... [怀孕暂停] 我们确实将消息队列用于其他功能。我唯一的犹豫是开销。我宁愿它完全解耦我正在寻找一个应用程序到应用程序的解决方案。我宁愿服务是“倾听”而不是去获取。
结局
我进行了更多研究,并确定使用 WCF 符合我的最大利益。 作为 Windows 服务的一部分,我计划为事件日志服务添加一个 app.config,然后将服务配置为在 localhost 上使用命名管道。
感谢大家的帮助
跟进
对于任何可能感兴趣的人。这很好用。 net.pipe 处于活动状态,我能够创建事件并将它们从多个应用程序发送到服务,而处理时间很少或根本没有。
wcf 服务被封装在一个非常简单的 windows 服务中,它只是打开了服务管道。在客户端,我能够轻松地发现和实施服务。我所要做的就是调用客户端类,它会在数据库中实时显示我的事件。
再次感谢。
【问题讨论】: