c# - HTML5 EventSource onmessage never called from Web API 2 -
i have restful web api 2 solution methods called angularjs application. wanted add support sending notifications server side api client logic. message , open methods setup via calls addeventlistener in javascript never called. web api controller follows:
namespace controllers { public class eventcontroller : apicontroller { private static readonly list<streamwriter> connectedclients = new list<streamwriter>(); private static timer _timer; public eventcontroller() { if(_timer == null) _timer = new timer(timercallback, null, 0, 2000); } public static void onstreamavailable(stream stream, httpcontent headers, transportcontext context) { var streamwriter = new streamwriter(stream); connectedclients.add(streamwriter); } private static void messagecallback(message m) { foreach (var subscriber in connectedclients) { try { subscriber.write("data: {0}\n\n", jsonconvert.serializeobject(m)); subscriber.flush(); } catch (exception ex) { // means user has disconnected connectedclients.remove(subscriber); } } } private static void timercallback(object state) { var m = new message { date = datetime.now.touniversaltime().tostring("u"), text = "hello world!" }; messagecallback(m); } [httpget] public httpresponsemessage get(httprequestmessage request) { // new subscription request var response = request.createresponse(); response.headers.add("access-control-allow-origin", "*"); response.headers.add("cache-control", "no-cache, must-revalidate"); response.content = new pushstreamcontent((action<stream, httpcontent, transportcontext>)onstreamavailable, "text/event-stream"); return response; } } } note have tried following httpget method:
public httpresponsemessage get() { // new subscription request var response = request.createresponse(); response.headers.add("access-control-allow-origin", "*"); response.headers.add("cache-control", "no-cache, must-revalidate"); response.content = new pushstreamcontent((action<stream, httpcontent, transportcontext>)onstreamavailable, "text/event-stream"); return response; } the javascript:
if (!!window.eventsource) { var eventsource = new eventsource(globalconfig.apiroot + 'event'); eventsource.addeventlistener('open', function (e) { console.log("open"); }, false); eventsource.addeventlistener('error', function (e) { console.log("error"); }, false); eventsource.addeventlistener('message', function (e) { console.log('message'); }, false); } else { // not supported! } i running via iisexpress under visual studio 2013. have tested under iis 8 same result. tests done in version 36.0.1985.143 m of google chrome. can verify is:
- the method in web api called.
- the timer (which setup sake of testing) runs , calls timercallback method expected. messagecallback run.
- if shut down visual studio/iisexpress chrome open error method in javascript called net::err_connection_refused error.
- similarly if shut down browser visual studio/iisexpress running httpexception thrown in messagecallback controller method.
that is, there appear sort of connection, can't figure out why message , open handlers never called in javascript.
to check nothing in angularjs may have been affecting things moved javascript static html page. following logged in chrome console:
request url:http://localhost/.../api/event request headers provisional headers shown accept:text/event-stream cache-control:no-cache referer:http://localhost/.../test.html user-agent:mozilla/5.0 (windows nt 6.3; wow64) applewebkit/537.36 (khtml, gecko) chrome/36.0.1985.143 safari/537.36 the status request 'pending'. given connection stays open expect.
any suggestions regard getting functional gratefully received.
i think correct formatting is:
subscriber.write("event: message\n"); subscriber.write("data: {0}\n\n"); the event listener responds events contain event message name (in case message). means server able send multiple event types can subscribed separately.
Comments
Post a Comment