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

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

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

php - Why does AJAX not process login form? -