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:

  1. the method in web api called.
  2. the timer (which setup sake of testing) runs , calls timercallback method expected. messagecallback run.
  3. if shut down visual studio/iisexpress chrome open error method in javascript called net::err_connection_refused error.
  4. 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

Popular posts from this blog

single sign on - Logging into Plone site with credentials passed through HTTP -

php - Why does AJAX not process login form? -

java - How to specify maven bin in eclipse maven plugin? -