Web API 和外部事件处理



我有一个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 之外发生一些事情。

根据以下示例,如何在服务类中注册事件处理程序 UserRegister?

网页接口控制器

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()
    {
    }
}

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

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

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

HTTP处理必须快速而简单。复杂任务的委派应通过附加机制\技术而不是通过 .NET 事件转到其他服务。从许多角度来看,这是反对实践和不切实际的。

最新更新