Servicestack服务器发送事件

时间:2014-09-21 15:24:13

标签: servicestack

我刚开始搞乱我自己的ServiceStack服务器事件实现。

在阅读wiki部分并阅读聊天应用程序的代码后,我开始创建自己的新mvc4项目并通过nuGet安装所有ServiceStack库。

配置并创建AppHost后,我创建了一个新的“helloworld”服务并启动了该网站,以确保它有效(确实有效)。

现在的主要问题。根据现有的示例代码(聊天应用程序),我创建了新的HTML页面和调用ServerEvents.NotifyChannel的服务,然后我启动了新网站。

当通过ajax(post)调用服务时,调试器会遇到断点,但是当服务返回时不会触发客户端事件。更重要的是,似乎通知有点“缓存/延迟”,当第二次调用服务时,客户端会从第一次调用中接收数据。

我应该使用servicestack.razor次观看吗?我应该再次创建另一个MVC应用程序,从头开始构建所有内容以进行测试吗?

编辑此帖子以添加代码(如指出):https://github.com/xspadax/SS_SSE_Test

1 个答案:

答案 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项目没有这个问题。

替代仅代码解决方案

v4.0.32 + 中的

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行。这是一个有效的替代解决方案,因为在服务器发送事件中忽略尾随的新行。