跨应用程序通信(C#)

跨应用程序通信(C#),c#,wcf,ipc,msmq,C#,Wcf,Ipc,Msmq,我正在为运行在同一台服务器上的一组应用程序开发一个软件解决方案 这些应用程序是松散相关的,并共享一个事件日志。我们遇到的问题是性能,每个应用程序每次需要记录事件时都会调用数据库 我试图做的是通过删除应用程序对数据库的直接调用,并通过运行在机器上的服务(其唯一目的是处理来自机器上多个应用程序的事件)来路由它们,从而使整个过程解耦 最终,我的目标是在“事件”助手对象中实现某种系统,允许这些对象直接与“事件”服务通信 我的第一反应是使用典型的“事件”,但从我所做的研究来看,不可能在一个流程中调用一个

我正在为运行在同一台服务器上的一组应用程序开发一个软件解决方案

这些应用程序是松散相关的,并共享一个事件日志。我们遇到的问题是性能,每个应用程序每次需要记录事件时都会调用数据库

我试图做的是通过删除应用程序对数据库的直接调用,并通过运行在机器上的服务(其唯一目的是处理来自机器上多个应用程序的事件)来路由它们,从而使整个过程解耦

最终,我的目标是在“事件”助手对象中实现某种系统,允许这些对象直接与“事件”服务通信

我的第一反应是使用典型的“事件”,但从我所做的研究来看,不可能在一个流程中调用一个事件来在另一个流程中处理

作为我研究的一部分,我遇到了很多人

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();
        }
    }
}
我保证服务器不会允许服务注册该本地地址(它已经尝试过了,但失败了)

所以我的新问题是。。。“有没有一种方法不涉及更改服务器本身的配置设置?”

MSMQ更新:

这在财务上是一种选择,但。。。[pause]我们确实将消息队列用于其他功能。我唯一犹豫不决的是头顶上。我宁愿它是完全解耦的,我正在寻找一个应用程序到应用程序的解决方案。我宁愿服务是“倾听”,而不是去得到

结局

我做了更多的研究,我决定使用WCF是我最感兴趣的。 作为windows服务的一部分,我计划为事件日志记录服务添加app.config,然后配置该服务以通过localhost使用命名管道

谢谢你的帮助

跟进

对于任何可能感兴趣的人。这工作很漂亮。net.pipe处于活动状态,我可以创建事件并将它们从多个应用程序发送到服务,而处理时间很少或没有

wcf服务封装在一个非常简单的windows服务中,该服务只需打开服务管道。在客户端,我能够轻松地发现和实现服务。我所要做的就是调用client类,它会在数据库中实时显示我的事件


再次感谢。

我以前遇到过这个要求。解决方案通常涉及将“事件”写入“队列”,并让专用服务读取队列并发布到数据库。WCF支持MSMQ,是一个很好的选择。

您正在向我描述一个听起来很像服务总线体系结构的东西,而我对这个主题却不太了解。还是我完全错了?如果不是,请查看产品,如NServiceBus(http://www.nservicebus.com/). 也许这对你有帮助

问候,,
莫顿

我建议使用WCF。为了安全起见,它可以很容易地配置为只接受来自本地计算机的请求,并且比SendMessage或直接使用NamedPipes或Ports更利于友好的.NET代码。

如果您喜欢SendMessage的概念,请查看我们的产品,它为运行在相同或不同系统上的进程之间的通信提供了相同的方法。MsgConnect是跨平台的,不限于.NET


WCF也可以是一个选项,尽管MsgConnect的API可能更简单、更易于管理(因为您还可以获得源代码和支持)

您可以在没有web主机和IIS的情况下执行WCF,这些WCF服务将是TcpIp,并且将在您的本地网络中正常工作,这样您就没有SOAP序列化

您也可以使用的一种方法(我在以前的一家公司使用过,我们有一个多服务器多层分布式应用程序),就是让事件助手对象将消息简单地排队发送到将驻留在某个服务器上的MSMQ,这种方法工作得很好,因为它不像SendMessage那样是同步的,所以即使侦听器应用程序不可用、不运行或只是忙,应用程序也可以工作


然后你可以在那台机器上运行一个windows服务(我们过去称之为LoggingManager),它可以查看队列中的消息,并以自己的速度和平稳地在数据库中创建日志;-)

我认为您需要一个自托管的WCF应用程序。这是一本关于WCF的好书,第四章讨论了自我托管。

除了这些其他答案之外:您的“事件”助手可能是您在各种应用程序中注册的一个角色。这样,您就不必在应用程序中直接引用“事件”助手目标,只需将事件记录到配置的跟踪输出中即可。

如果可以,请查看我的更新以了解更多信息
Uri baseAddress = new Uri("http://localhost:8080/SelfHost");