Unable to receive events from server in ServiceStack

asked8 years ago
last updated8 years ago
viewed634 times
Up Vote1Down Vote

i'm having problem using events in my servicestack application. I'm creating an SOA applicatin based on ServiceStack. I've had no problem creating a simple GET/POST manager within the host. Now i would like to add events

I'm trying using an example, but the event is not received by the client

Does someone have an idea about that?

This is my server:

ServiceStack.Text.JsConfig.EmitCamelCaseNames = true;

ServerEventsFeature serverEventsFeature = new ServerEventsFeature()
{
    LimitToAuthenticatedUsers = false,
    NotifyChannelOfSubscriptions = true,
    OnPublish = (res, msg) =>
    {
        //fired after ever message is published
        res.Write("\n\n\n\n\n\n\n\n\n\n");
        res.Flush();
    },
    OnConnect = (eventSubscription, dictionary) =>
    {
    },
    OnSubscribe = (eventSubscription) =>
    {
    }
};
Plugins.Add(serverEventsFeature);

container.Register<IServerEvents>(c => new MemoryServerEvents());
container.Register(c => new FrontendMessages(c.Resolve<IServerEvents>()));
container.Register<IWebServiceEventManager>(c =>  new WebServiceEventManager(DeviceManager, macroManager));

SetConfig(new HostConfig
{
    DefaultContentType = MimeTypes.Json,
    EnableFeatures = Feature.All.Remove(Feature.Html),
});

public class FrontendMessage
{
    public string Level { get; set; }
    public string Message { get; set; }
}

public class FrontendMessages
{
    private readonly IServerEvents _serverEvents;
    private Timer _timer;

    public FrontendMessages(IServerEvents serverEvents)
    {
        if (serverEvents == null) throw new ArgumentNullException(nameof(serverEvents));
        _serverEvents = serverEvents;            
    }

    public void Start()
    {
        var ticks = 0;
        _timer = new Timer(_ => {
            Info($"Tick {ticks++}");
            _timer.Change(500, Timeout.Infinite);
        }, null, 500, Timeout.Infinite);
    }

    public void Info(string message, params object[] parameters)
    {
        var frontendMessage = new FrontendMessage
        {
            Level = "success",
            Message = message
        };

        Console.WriteLine("Sending message: " + frontendMessage.Message);
        _serverEvents.NotifyChannel("messages",  frontendMessage);
    }

This is my client:

public async void Connect()
{
    try
    {
        Task.Delay(2000).Wait();
        clientEvents = new ServerEventsClient("http://127.0.0.1:20001/", "messages");
        clientEvents.OnConnect = (msg) =>
        {
        };

        clientEvents.OnHeartbeat = () =>
        {

        };
        clientEvents.OnCommand = (msg) =>
        {

        };
        clientEvents.OnException = (msg) =>
        {

        };
        clientEvents.OnMessage = (msg) =>
        {

        };
        Dictionary<string, ServerEventCallback> handlers = new Dictionary<string, ServerEventCallback>();
        handlers.Add("messages", (client, msg) =>
        {

        });
        clientEvents.RegisterHandlers(handlers);

        await clientEvents.Connect();
        client = (IServiceClient)(clientEvents.ServiceClient);
    }
    catch (Exception e)
    {
    }
}