我刚开始搞乱我自己的ServiceStack服务器事件实现。
在阅读wiki部分并阅读聊天应用程序的代码后,我开始创建自己的新mvc4
项目并通过nuGet安装所有ServiceStack库。
配置并创建AppHost
后,我创建了一个新的“helloworld”服务并启动了该网站,以确保它有效(确实有效)。
现在的主要问题。根据现有的示例代码(聊天应用程序),我创建了新的HTML页面和调用ServerEvents.NotifyChannel
的服务,然后我启动了新网站。
当通过ajax(post)调用服务时,调试器会遇到断点,但是当服务返回时不会触发客户端事件。更重要的是,似乎通知有点“缓存/延迟”,当第二次调用服务时,客户端会从第一次调用中接收数据。
我应该使用servicestack.razor
次观看吗?我应该再次创建另一个MVC应用程序,从头开始构建所有内容以进行测试吗?
编辑此帖子以添加代码(如指出):https://github.com/xspadax/SS_SSE_Test
答案 0 :(得分:3)
此问题是由于Flush()
在 ASP.NET MVC 项目中无法正常工作,这些项目在启用压缩时似乎会自动缓冲,对于动态页面可以禁用它:
<system.webServer>
<urlCompression doStaticCompression="true" doDynamicCompression="false" />
</system.webServer>
在启用压缩时,连缓冲输出的显式API似乎都没有任何效果:
Response.BufferOutput = false;
不使用像ServiceStack + Razor这样的ASP.NET MVC的普通ASP.NET项目没有这个问题。
New API's were added now available on MyGet为ServiceStack的服务器事件功能提供了更多自定义挂钩,OnInit
可用于修改HTTP标头服务器事件流,而每个消息发布后触发OnPublish()
回调:
Plugins.Add(new ServerEventsFeature {
/*
OnInit = req => { //fired when sending headers in server event stream
var res = (HttpResponseBase)req.Response.OriginalResponse; //Get MVC Response
res.BufferOutput = false; // Should make Flush() work, but doesn't
},
*/
OnPublish = (res, msg) => { //fired after ever message is published
res.Write("\n\n\n\n\n\n\n\n\n\n");
res.Flush();
}
});
上述解决方案涉及在MVC中向强制刷新写入一些尾随\n
行。这是一个有效的替代解决方案,因为在服务器发送事件中忽略尾随的新行。