gpt4 book ai didi

c# - 从 Service Fabric Web API Controller 写入服务事件源

转载 作者:行者123 更新时间:2023-11-30 15:59:08 25 4
gpt4 key购买 nike

在我的有状态服务中,我可以通过调用以下代码写入 ServiceEventSource:

ServiceEventSource.Current.ServiceMessage(this.Context, "this is my log message");

有谁知道如何在我的无状态 WebAPI Controller 中进行相同的调用?似乎我无法将上下文获取到 Controller 中。我注意到它仅在我的 OwinCommunicationListener 中可用。

基本上,我希望能够像这样记录我的 Controller :

public async Task<IHttpActionResult> Get(string id)
{
ServiceEventSource.Current.ServiceMessage(this.Context, "this is my log message");
//Do something
return Ok(100);
}

最佳答案

解决此问题的一种方法是使用依赖注入(inject)和 IoC,就像使用常规 WebAPI 解决方案一样。

如果您使用开箱即用的 OwinCommuncationControllerStartup 类,您可以初始化并将容器添加到 Startup.ConfigureApp (...) 方法:

public static class Startup
{
// This code configures Web API. The Startup class is specified as a type
// parameter in the WebApp.Start method.
public static void ConfigureApp(IAppBuilder appBuilder)
{
// Configure Web API for self-host.
HttpConfiguration config = new HttpConfiguration();

config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);

// Add a DependencyResolver here

appBuilder.UseWebApi(config);
}
}

您可以使用任何您喜欢的 IoC,在这里我将展示它用于 TinyIoC,但对于任何(Windsor、Unity、Ninject、AutoFac...)都采用类似的方法。

对于 TinyIoC 添加 NuGet TinyIoCTinyIoC.AspNetExtensions 并添加一个实现 IDependencyResolver 的类:

public class TinyIoCResolver : IDependencyResolver
{
private readonly TinyIoCContainer _container;

public TinyIoCResolver(TinyIoCContainer container)
{
_container = container;
}

public object GetService(Type serviceType)
{
return _container.Resolve(serviceType);
}

public object GetService(Type serviceType)
{
try
{
return _container.Resolve(serviceType);
}
catch (TinyIoCResolutionException)
{
return null;
}
}

public IDependencyScope BeginScope()
{
return new TinyIoCResolver(_container.GetChildContainer());
}

public void Dispose()
{
// Handle dispose
}
}

注意,这只是简单的实现,为了更好地阅读本文 http://blog.i-m-code.com/2014/04/15/tinyioc-mvc-and-webapi-configuration/

不更新您的 Startup 以允许 WebApi 使用 DependencyResolver:

public static class Startup
{
public static void ConfigureApp(IAppBuilder appBuilder, TinyIoCContainer container)
{
...

config.DependencyResolver = new TinyIoCResolver(container);

...
}
}

最后在您的服务中注册您的依赖项 (StatelessServiceContext):

internal sealed class WebApiService : StatelessService
{
public TinyIoCContainer Container { get; private set; }

public WebApiService(StatelessServiceContext context)
: base(context)
{
Container = new TinyIoCContainer();
Container.Register<StatelessServiceContext>(context);
}

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new ServiceInstanceListener[]
{
new ServiceInstanceListener(serviceContext => new OwinCommunicationListener(appBuilder => Startup.ConfigureApp(appBuilder, Container), serviceContext, ServiceEventSource.Current, "ServiceEndpoint"))
};
}
}

请注意,您必须对调用 Startup.ConfigureApp 方法的方式稍作更改,以便也提供您的容器。

现在您所要做的就是将 StatelessServiceContext 添加为 ApiController 的构造函数中的依赖项,并将其作为成员存储在您的 Controller 中:

public ValuesController(StatelessServiceContext serviceContext) 
{
_serviceContext = serviceContext;
}

然后在您的 Controller 操作中使用它:

ServiceEventSource.Current.ServiceMessage(_serviceContext, "this is my log message");

关于如何执行此操作、何时何地创建容器、如何解析 Controller 等等,有许多变体。应该有很多关于如何设置 ASP.NET WebApi 和 IoC 依赖注入(inject)的指南。

关于c# - 从 Service Fabric Web API Controller 写入服务事件源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41969320/

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