我有一个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 事件转到其他服务。从许多角度来看,这是反对实践和不切实际的。