【问题标题】:REST Webservice for HTML5 Server Side Events用于 HTML5 服务器端事件的 REST Web 服务
【发布时间】:2012-06-01 19:03:18
【问题描述】:

目前,我有一个 C# 控制台应用程序,它通过 WebServiceHost 公开 Web 服务,这些 Web 服务正在被网站使用,但现在我正在尝试将 SSE 添加到该网站。

客户端的代码是:

var source = new EventSource(server+'eventSource');
source.onmessage = function (event) {
  alert(event.data);
};  

但是在服务器端,当我尝试定义合约时:

[OperationContract]
[WebGet]
String EventSource();

服务返回的服务是一个带有字符串的 xml。

我应该在服务器端做什么来创建可用于 SSE 的文档?

提前感谢

【问题讨论】:

标签: c# web-services html rest


【解决方案1】:

如果您有 OperationContract,则返回类型始终序列化为 XML 或可选的 JSON。如果您不希望返回值被序列化,请将其定义为 Stream。

[OperationContract] 
[WebGet] 
Stream EventSource(); 

// Implementation Example for returning an unserialized string.
Stream EventSource()
{
   // These 4 lines are optional but can spare you a lot of trouble ;)
   OutgoingWebResponseContext context = WebOperationContext.Current.OutgoingResponse;
   context.Headers.Clear();
   context.Headers.Add("cache-control", "no-cache");
   context.ContentType = "text/event-stream"; // change to whatever content type you want to serve.

   return new System.IO.MemoryStream(Encoding.ASCII.GetBytes("Some String you want to return without the WCF serializer interfering.")); 
}

如果您自己构建流,请记住在返回之前执行.Seek(0, SeekOrigin.Begin);

编辑: 更改了命令顺序以在清除标头后设置 ContentType。否则你也会清除新设置的 ContentType ;)

【讨论】:

  • 谢谢,工作正常,我做的唯一改变是 SSE 的 contentType 是“event-stream”
  • 如果您直接从浏览器访问它可以正常工作,但是当它与 SSE 相关联时,我得到“EventSource 的响应具有不是“text/”的 MIME 类型(“application/octet-stream”)事件流""有什么想法吗?
  • 它被设置为“文本/事件流”,我真的很想使用 SSE :(
  • 我用简单的 rest 客户端检查了它,我得到了 "Content-Type: application/octet-stream" :S 我该如何更改它?
  • 我不小心在示例代码中输入了错误的顺序。请将带有context.ContentType = "..."; 的行放在 Headers.Clear() 语句之后。我相应地更改了答案中的代码。如果您设置内容类型并随后清除所有内容,则它无法正常工作;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
相关资源
最近更新 更多