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