4

我有一个 windows 服务,我想在这个服务上公开一个 web api,这样我们的用户就可以通过 http 与服务交互。

我了解如何做一个自托管 web api ( http://www.asp.net/web-api/overview/hosting-aspnet-web-api/self-host-a-web-api ),现在我的主要问题是如何将我的 ApiController 与将要执行的类接口,以便在处理 http 请求时触发事件,并且在 ApiController 之外发生一些事情。

基于以下示例,如何在我的服务类中注册我的事件处理程序 UserRegistered ?

Web API 控制器

public class MyController : ApiController
    {
        public delegate void OnPostRegister(Profile user);

        public event OnPostRegister UserRegistered;

        public void PostStream(Profile user)
        {
            try
            {
                IProfileBuilder builder = new ProfileBuilder();
                builder.RegisterProfile(user);

                if (UserRegistered!= null)
                {
                    UserRegistered(user);
                }

            }
            catch (Exception ex)
            {
                throw new HttpException(500, ex.Message);
            }
        }

服务等级

public partial class Service1 : ServiceBase
{
    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        //initialize web api
        var config = new HttpSelfHostConfiguration("http://localhost:8080");

        config.Routes.MapHttpRoute(
            "API Default", "api/{controller}/{id}",
            new { id = RouteParameter.Optional });

        using (var server = new HttpSelfHostServer(config))
        {
            server.OpenAsync().Wait();
        }

        //Load registered profiles
    }

    protected override void OnStop()
    {
    }
}
4

2 回答 2

2

我认为您不能直接访问控制器的实例来订阅事件;我认为您可能想要一个松散耦合的事件处理程序;我打算建议使用 EventAggregator,但它是 Prism 的一部分,它更适合 WPF,尽管您可以提取它。我确实发现这个看起来可以解决你的问题。

http://blogs.taiga.nl/martijn/2011/07/28/loosely-coupled-events-in-net-and-harvesting-open-source-projects/

于 2013-10-29T14:04:20.960 回答
0

很抱歉,您不了解 Web api 以及与 .NET 世界中其他服务\应用程序合作背后的概念。你不能这样做:调用 .NET 事件来触发外部服务 - 这是一个疯狂的想法。您在这里几乎没有选择:A)服务总线 - 将事件从 web api 传递到外部服务来处理它(NServiceBus,RabitMQ);B) 将处理委托给 HangeFire;C)任何自定义机制来通知外部系统有关 web api 事件\更改(db 触发器或任何最终难以维护的糟糕想法,就像您现在尝试做的那样) D)您可以使用您的逻辑创建库超级 Windows 服务并为其创建 API,您可以创建 HTTP 客户端以从任何地方调用此 API - 即使您可以重构旧服务。

Http 处理必须快速简单。复杂任务的委派应该通过额外的机制\技术而不是通过 .NET 事件转到其他服务。从许多角度来看,这与现行做法不符且不切实际。

于 2021-10-30T21:08:08.160 回答