gpt4 book ai didi

c# - 跨应用程序通信 (C#)

转载 作者:太空狗 更新时间:2023-10-30 00:45:38 25 4
gpt4 key购买 nike

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

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

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

Event Helper Service - Image

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

我的第一直觉是使用典型的“事件”,但从我所做的研究来看,似乎不可能在一个进程中调用事件以在另一个进程中处理。

作为我研究的一部分,我遇到了 Listen for events in another applicationC# 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,然后将该服务配置为在本地主机上使用命名管道。

谢谢大家的帮助

跟进

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

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

再次感谢。

最佳答案

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

您还可以使用的一种方法(我确实在我们拥有多服务器多层分布式应用程序的前公司中使用过)是使您的事件助手对象简单地将消息排队到 MSMQ,该 MSMQ 将驻留在某些服务器,此方法非常有效,因为它不像 SendMessage 那样同步,因此即使监听器应用程序不可用且未运行或只是忙,您的应用程序也能正常工作。

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

关于c# - 跨应用程序通信 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5070941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com