Emit Node.js Push Event from c# code behind - c#

I have a Node.js Http Server and Socket.IO running for my web app keeping all the clients in sync in real time. I'm pushing node events out from the client and from the node server, both broadcasts and to individual "rooms". This stuff is amazing.
Now, I have a use case where I would like to emit out a node.js event with a few params from c# code behind, inside a web service call.
[WebMethod]
public MyMethod()
{
// emit node.js event
}
I thought about having a simple html page that requests querystring params and has node initialized in it. And c# code behind just does a http web request calling the url with the params? Not sure if that will work or be efficient, but first idea off the top of my head.
Any ideas or recommendations how to approach this one? Currently, I'm limited to .NET 4.0

Related

Proprietary bare-bone ASP web service

I want to create a proprietary minimal / bare-bone / data-light webservice. I prefer not to use the standard solutions like Restful, WebAPI, SOAP, WCF, etc.
I just want a web server listener that can receive and process 1 UTF8 string (own message format) and respond with 1 UTF8 string as the result.
My question is: can you give me a starting point, by providing a code example of the interface. Of course not the complete implementation.
Data transfer has to be as minimal as possible (no avoidable headers).
NB: Server language has to be .NET. Code example may be in C# or VB.
The most bare-bone thing to create a web service would be an HTTP Handler.
The sample I linked returns HTML but you could send back XML as well (or anything else really, just make sure to return an appropriate Content Type).
The call to your method would be a regular HTTP call of the URL of your Handler.

Android HTTP to C# Server

Using HTTP I want to send simple string data through android to a C# .NET server. This link suggests using OKHTTP which looks great, but I'm not sure how this would talk to a C# server as I will need a 'connection' where I can send data back to the android phone.
OKHTTP seems to manage drops in connection elegantly according to the website, which is fantastic because I need this kind of persistance, but I'm not sure how I would implement the C# side.
Does anyone know a method of accomplishing this?
It sounds as though you want to do a normal HTTP POST to your server. It's the same thing that would happen when you fill out a form on a web-page and submit the data to a server. If it's a normal kind of webserver it should have full support for receiving a POST and returning a response as well. Are you writing the .NET web service as well?
As for client side technology to use: OkHTTP is a greaty drop-in class for making HTTP requests to a server, but if you plan to do many of them you should also look into wrapping the actual HTTP client into an API that takes care of asynchronous callbacks and things like that. You don't want to be doing HTTP requests on the UI thread and it's boring and error prone to wrap all such calls in AsyncTasks or similar. Take a look at AndroidAsyncHttpClient:
"An asynchronous callback-based Http client for Android built on top of Apache’s HttpClient libraries. All requests are made outside of your app’s main UI thread, but any callback logic will be executed on the same thread as the callback was created using Android’s Handler message passing."
(As a sidenote AndroidAsyncHttpClient might get support for using OkHTTP instead of the default Apache HttpClient)
POSTing to a server is as simple as this:
RequestParams params = new RequestParams();
params.put("A_KEY_TO_IDENTIFY_YOUR_STRING", "THE_STRING_YOU_WANT_TO_SEND");
AsyncHttpClient client = new AsyncHttpClient();
client.post("http://www.yourserver.com", params, new AsyncHttpResponseHandler() {
#Override
public void onSuccess(String response) {
// handle your response from the server here
System.out.println(response);
}
});

How do you handle an Async Response from a Web Service

I was given the task of creating a web based client for a web service.
I began building it out in c# | .net 4.0 | MVC3 (i can use 4.5 if necessary)
Sounded like a piece of cake until I found out that some of their responses would be asynchronous. This is the flow ... you call a method and they return a response of ack or nack letting you know if your request was valid. Upon an ack response you should expect an async response with the data you requested, which will be sent to a callback url that you provide in your request.
Here are my questions:
If I'm building a web app and debugging on localhost:{portnum} how can I give them a callback url.
If I have already received a response (ack/nack) and my function finishes firing isn't my connection to the client then over ? How would I then get the data back to the client? My only thought is maybe using something like signalR, but that seems crazy for a customer buy flow.
Do I have to treat their response like a webhook? Build something separate that just listens and has no knowledge of the initial request. Just save the data to a db and then have the initial request while loop until there is a record for the unique id sent from the webhook.... oye vey
This really has my brain hurting :-/
Any help would be greatly appreciated. Articles, best practices, anything.
Thanks in advance.
If you create your service reference, it will generate a *ServiceMethod*Completed delegate. Register an event handler on it to process your data.
Use the ServiceMethod_Async() method to call the service.
The way I perceived your question is as follows, though please correct me if I'm wrong about this:
1) You send a request to their endpoint with parameters filled with your data. In addition, you send a:
callback url that you provide in your request. (quoted from your question)
2) They (hopefully) send an ack for your valid request
3) They eventually send the completed data to your callback url (which you specified).
If this is the flow, it's not all that uncommon especially if the operations on their side may take long periods of time. So let's say that you have some method, we'll call it HandleResponse(data). If you had originally intended to do this synchronously, which rarely happens in the web world, you would presumably have called HandleResponse( http-webservice-call-tothem );
Instead, since it is they who are initiating the call to HandleResponse, you need to set a route in your web app like /myapp/givemebackmydata/{data} and hook that to HandleResponse. Then, you specify the callbackurl to them as /myapp/givemebackmydata/{data}. Keep in mind without more information I can't say if they will send it as the body of a POST request to your handler or if they will string replace a portion of the url with the actual data, in which case you'd need to substitute {data} in your callback url with whatever placeholder they stipulate in their docs. Do they have docs? If they don't, none of this will help all that much.
Lastly, to get the data back on the client you will likely want some sort of polling loop in your web client, preferably via AJAX. This would run on a setInterval and periodically hit some page on your server that keeps state for whether or not their webservice has called your callback url yet. This is the gnarlier part because you will need to provide state for each request, since multiple people will presumably be waiting for a callback and each callback url hit will map to one of the waiting clients. A GUID may be good for this.
Interesting question, by the way.

ASP.Net Response.Close issue

I am using ASP.Net + .Net 3.5 + VSTS 2008 + IIS 7.0 + C# to develop a web application. I find when debugging in VSTS 2008, if I call Response.Close() method in page_load (please refer to code below), there will be error (from IE when accessing the page) like can not connect to server.
My question is,
Normally when should we call Response.Close()? Or no need to call (rely on ASP.Net framework to automatically close)?
BTW: my previous understanding is developer should always call Response.Close when processing is completed at server side and all data has been written to client using Response.Write. Am I correct?
2 Why I met with such error in my code? What is the root cause?
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("Hello World! ");
Response.Close();
}
The following from the MSDN website might be useful here:
This method terminates the connection to the client in an abrupt manner and is not intended for normal HTTP request processing. The method sends a reset packet to the client, which can cause response data that is buffered on the server, the client, or somewhere in between to be dropped.
You might use this method in response to an attack by a malicious HTTP client. However, typically you should call CompleteRequest instead if you want to jump ahead to the EndRequest event and send a response to the client.
You should not normally use the Response.Close method in "normal" ASP.NET processing.
All of your data that is written to a HttpResponse "stream" is buffered before being sent to the client browser. The Response.Close method will abruptly terminate the HTTP connection and you may lose data that you have previously Response.Written inadvertently.
If you really want to programmatically "force" the end of a response stream, you should use either: Response.Flush(); followed by Response.End();
The Response.Flush method call ensures that all data that you may have written to the response stream is "flushed" to the client, and Response.End ensures all currently buffered data is correctly sent to client, and also raises the EndRequest event, which you may want to handle.
You can also use the HttpApplication's CompleteRequest() method.
The MSDN documentation states it best:
This method terminates the connection
to the client in an abrupt manner and
is not intended for normal HTTP
request processing. The method sends a
reset packet to the client, which can
cause response data that is buffered
on the server, the client, or
somewhere in between to be dropped.
You might use this method in response
to an attack by a malicious HTTP
client. However, typically you should
call CompleteRequest() instead if
you want to jump ahead to the
EndRequest event and send a response
to the client.
In my experience there is no reason to call Response.Close(); within the code example you've provided, just remove it.
In the pages lifecycle after the Page_Load is fired, there are a number of other methods that will be called that will close your responses for you.
Read here for the Page Lifecycle
To answer question 1:
You should call Response.Close() when your need to terminate the connection - that is, nothing else needs to be sent to the client at all. This does not include what you have posted, since the rest of the page needs to be processed and sent to the client. Normally you would call it when returning data that is not a page from an aspx page (for example a pdf file, an image etc...).
To answer question 2:
You should not call Response.Close() in your Page_Load event handler - it will mean that the rest of the page lifecycle will not run properly.
From MSDN (HttpResponse.Close method):
This method terminates the connection to the client in an abrupt manner and is not intended for normal HTTP request processing. The method sends a reset packet to the client, which can cause response data that is buffered on the server, the client, or somewhere in between to be dropped.
.NET is a very flexible network it will let you do anything you could before .NET. (and more obviously). But the most wonderfull thing is that .NET will take care of verything it can take care of for you.
That means if you create and empty web page and run it in your browser you don't have to do anything else to make it work.
Sometimes however you might find yourself in a situation where you need to do something extraordinary and you will be thankfull for the existance of functions like Reponse.Close()
In your case you're not doing such a thing so there's no need for any special function calling.
Besides that Response.Write() is what we used to use back in the days...Are you still thinking in the classic ASP mode maybe?
Suggestion: Don't use Response.Write()
But put a label in your web page and use:
this.Label1.Text = "Hello world";
Addtional comment:
The purpose of ASP.Net in particular is to send web pages to a browser, collect any posted data, process it, interact with the server OS and so on.
So you might, in my opinion, assume that some care has been taken in 1) serving pages fast and 2) making sure nothing goes wrong when the user follows the guide lines on how to program .Net web pages.
There's no need to implement ALL Page event handlers. Understand the framework, understand what each page event does and learn when to implement which event.
If you're only going to show data from a database you don't even need event handlers.
Read about the Data Controls (Data sources, GridView, ListView, Repeater, etc).
Assume that if you do nothing, the framework will do it for you.
(IF you do nothing at all, nothing happens, that's by design)
Cheers.

Setup Http Post Server

I have a mobile application which I want to call a http post to pass a binary string and write it to a SQL Server. Can you please give me some examples of code in setting up a http post server (Server side code) to accept 2 values (brinary string & DeviveID string).
Any help, advice or links welcome....
I don't know the iPhone side, but from the C# side, you could either do it via HTTP GET variables (e.g. http://www.example.com/?string=foo&devive=bar) and handle your SQL in there.
You could also run a small program that has a listening Socket or TcpListener on whatever port you want, and then have a BeginRead() method active waiting for input from the iPhone app. Once the BeginRead() returns with some data, you could then handle your SQL.
You could create a WCF REST service for this (look up the WCF REST Starter Kit), but as a quick-and-dirty solution you could do something much simpler: Just create an ASP.NET page that processes incoming POST data in its Page_Load handler.
If your POST format is the same one used by browsers (var1=123&var2=456), you can just use Request.Form["var1"] on the page. See http://forums.asp.net/t/1464546.aspx
If your POST format is different (e.g. XML), use Request.InputStream. See http://schlueters.de/blog/archives/31-Manually-processing-HTTP-POST-data-in-an-aspx.html
You could setup a Web Method on the web server to handle the requests from the iPhone app. Then you just send the data as a normal HTTP POST and the web method would handle the data, and call the SQL Server stored procedure.
You should be able to check the Request object to see if the data was posted and then perform your call to SQL Server.
For example:
Request.Params.Get( "sampleParam" )
will return the value of a sampleParam. As long as the posting application, page, or device posted the data you are expecting you will be able to get to it.

Categories

Resources