Servicestack 服务器发送事件

2024-02-16

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

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

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

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

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

我应该使用servicestack.razor意见?我是否应该创建另一个 MVC 应用程序并再次从头开始构建所有内容来测试它?

编辑这篇文章以添加代码(如所指出的):https://github.com/xspadax/SS_SSE_Test https://github.com/xspadax/SS_SSE_Test


这个问题是由于Flush()无法正常工作ASP.NET MVC启用压缩时似乎会自动缓冲的项目,可以通过以下方式对动态页面禁用它:

<system.webServer>
  <urlCompression doStaticCompression="true" doDynamicCompression="false" />
</system.webServer>

顺便说一句,当启用压缩时,甚至用于缓冲输出的显式 API 似乎也没有任何效果:

Response.BufferOutput = false;

不使用 ASP.NET MVC 的普通 ASP.NET 项目,例如服务堆栈+剃刀 http://razor.servicestack.net/没有这个问题。

替代的纯代码解决方案

添加了新的 API https://github.com/ServiceStack/ServiceStack/commit/786ff8d055870a559f0c8a094c67ef02a5bab778 in v4.0.32+ that's 现已在 MyGet 上提供 https://github.com/ServiceStack/ServiceStack/wiki/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();    
    }
});

上面的解决方案涉及编写一些尾随\n线路到强制冲洗在 MVC 中。这是一个有效的替代解决方案,因为服务器发送事件中会忽略尾随的新行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Servicestack 服务器发送事件 的相关文章

随机推荐