Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法从ServiceStack中的服务器接收事件_C#_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,C#,servicestack" /> servicestack,C#,servicestack" />

C# 无法从ServiceStack中的服务器接收事件

C# 无法从ServiceStack中的服务器接收事件,c#,servicestack,C#,servicestack,我在servicestack应用程序中使用事件时遇到问题。 我正在创建一个基于ServiceStack的SOA应用程序。我在主机中创建一个简单的GET/POST管理器没有问题。 现在我想添加一些事件 我尝试使用一个示例,但客户端没有接收到该事件 有人对此有想法吗 这是我的服务器: ServiceStack.Text.JsConfig.EmitCamelCaseNames = true; ServerEventsFeature serverEventsFeature = new ServerEv

我在servicestack应用程序中使用事件时遇到问题。 我正在创建一个基于ServiceStack的SOA应用程序。我在主机中创建一个简单的GET/POST管理器没有问题。 现在我想添加一些事件

我尝试使用一个示例,但客户端没有接收到该事件

有人对此有想法吗

这是我的服务器:

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);
    }
ServiceStack.Text.JsConfig.casenames=true;
ServerEventsFeature ServerEventsFeature=新的ServerEventsFeature()
{
LimitToAuthenticatedUsers=false,
NotifyChannelOfSubscriptions=true,
OnPublish=(res,msg)=>
{
//在消息发布后激发
res.Write(“\n\n\n\n\n\n\n\n\n\n”);
res.Flush();
},
OnConnect=(事件订阅,字典)=>
{
},
OnSubscribe=(事件订阅)=>
{
}
};
添加(serverEventsFeature);
Register(c=>newmemoryserverevents());
Register(c=>newfrontendmessages(c.Resolve());
Register(c=>newwebserviceeventmanager(DeviceManager,macroManager));
SetConfig(新主机配置)
{
DefaultContentType=MimeTypes.Json,
enableffeatures=Feature.All.Remove(Feature.Html),
});
公共类前端消息
{
公共字符串级别{get;set;}
公共字符串消息{get;set;}
}
公共类前端消息
{
专用readonly-IServerEvents\u-serverEvents;
私人定时器;
公共前端消息(IServerEvents服务器事件)
{
如果(serverEvents==null)抛出新的ArgumentNullException(nameof(serverEvents));
_serverEvents=serverEvents;
}
公开作废开始()
{
var=0;
_计时器=新计时器(=>{
信息($“Tick{ticks++}”);
_定时器。更改(500,超时。无限);
},null,500,超时。无限);
}
公共无效信息(字符串消息,参数对象[]参数)
{
var frontendMessage=新的frontendMessage
{
Level=“成功”,
消息=消息
};
Console.WriteLine(“发送消息:+frontendMessage.message”);
_serverEvents.NotifyChannel(“消息”,frontendMessage);
}
这是我的客户:

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)
    {
    }
}
公共异步void Connect() { 尝试 { Task.Delay(2000.Wait(); clientEvents=新服务器事件客户端(“http://127.0.0.1:20001/“,”信息“); clientEvents.OnConnect=(msg)=> { }; clientEvents.OnHeartbeat=()=> { }; clientEvents.OnCommand=(msg)=> { }; clientEvents.OnException=(msg)=> { }; clientEvents.OnMessage=(msg)=> { }; 字典处理程序=新字典(); 添加(“消息”,(客户端,消息)=> { }); 客户。登记管理员(管理员); 等待客户。连接(); client=(IServiceClient)(clientEvents.ServiceClient); } 捕获(例外e) { } } 首先,我推荐和提供工作配置的示例

您额外的
ServerEventsFeature
配置没有用处,因为您只是指定默认值,并且在您使用时不需要使用
Publish()
new line hack。因此,我将其更改为:

Plugins.Add(new ServerEventsFeature());
第二个问题是您使用的不正确,您的C#
服务器事件客户端
已连接到
消息
频道。您的处理程序用于侦听发送到
cmd.
选择器的消息(例如
cmd.FrontendMessage

因为您要将DTO发布到频道,即:

_serverEvents.NotifyChannel("messages",  frontendMessage);
您可以使用来处理它,例如:

public class GlobalReceiver : ServerEventReceiver
{
    public void Any(FrontendMessage request)
    {
        ...
    }
}

client.RegisterReceiver<GlobalReceiver>();
公共类GlobalReceiver:ServerEventReceiver
{
public void Any(前端消息请求)
{
...
}
}
client.RegisterReceiver();
谢谢mythz! 它工作正常

下一步是在javascript客户端上复制相同的行为(事件和get/post请求)

非常感谢!
利奥

谢谢。我试试看!