3

I need to call a web and retrieve the resulting data from the model in my asp.net mvc application. When accessed on the web, the form looks like this:

<form id="textEntryForm" name="textEntryForm" method="post" action="/project/evaluate_to_pdf">
            <textarea id="p" rows="20" name="p" cols="132"/><br/>   
            <input type="button" value="parse" name="do_parse" onclick="new Ajax.Updater('parsedProject','/project/parse',{asynchronous:true,evalScripts:true,on404:function(e){alert('not found!')},parameters:Form.serialize(this.form)});return false"/>
            <input type="button" value="evaluate_to_html" name="do_evaluate_to_html" onclick="new Ajax.Updater('parsedProject','/project/evaluate_to_html',{asynchronous:true,evalScripts:true,on404:function(e){alert('not found!')},parameters:Form.serialize(this.form)});return false"/>
            <input type="button" value="evaluate" name="do_evaluate" onclick="new Ajax.Updater('parsedProject','/project/evaluate',{asynchronous:true,evalScripts:true,on404:function(e){alert('not found!')},parameters:Form.serialize(this.form)});return false"/>
            <input type="button" value="evaluate to pdf source" name="do_evaluate_to_pdf_source" onclick="new Ajax.Updater('parsedProject','/project/evaluate_to_pdf_source',{asynchronous:true,evalScripts:true,on404:function(e){alert('not found!')},parameters:Form.serialize(this.form)});return false"/>
            <input type="submit" id="do_evaluate_to_pdf" value="evaluate_to_pdf" name="do_evaluate_to_pdf"/>
        </form>

I need to pass the data that would be entered into textarea id="p". How do add that in, using a WebClient to connect?

Thanks!

Edit This isn't for testing purposes, I need to retrieve the data for use in my application.

Brian
  • 4,931
  • 3
  • 32
  • 55
  • Suuuuuuuuuuuuuuuuuuure you need to retrieve data from your application. –  Apr 07 '09 at 18:26

6 Answers6

7

I just used this: http://www.eggheadcafe.com/community/aspnet/2/69261/you-can-use-the-webclient.aspx

Matt Grande
  • 11,964
  • 6
  • 62
  • 89
3

Another option is the Lightweight Test Automation Framework by Microsoft <- Here Steve Sanderson applies it to MVC.

alt text
(source: codeville.net)

alt text
(source: codeville.net)

Glorfindel
  • 21,988
  • 13
  • 81
  • 109
eduncan911
  • 17,165
  • 13
  • 68
  • 104
2

You create a Stream and pass it into your HttpWebRequest.

// Create a request using a URL that can receive a post. 
WebRequest request = 
    WebRequest.Create("http://www.contoso.com/PostAccepter.aspx ");
// Set the Method property of the request to POST.
request.Method = "POST";

// Create POST data and convert it to a byte array.
string postData = "p=Some text here from the textarea";

byte[] byteArray = Encoding.UTF8.GetBytes (postData);
// Set the ContentType property of the WebRequest.
request.ContentType = "application/x-www-form-urlencoded";
// Set the ContentLength property of the WebRequest.
request.ContentLength = byteArray.Length;
// Get the request stream.
Stream dataStream = request.GetRequestStream ();
// Write the data to the request stream.
dataStream.Write (byteArray, 0, byteArray.Length);
// Close the Stream object.
dataStream.Close ();
// Get the response.
WebResponse response = request.GetResponse ();
// Display the status.
Console.WriteLine (((HttpWebResponse)response).StatusDescription);
// Get the stream containing content returned by the server.
dataStream = response.GetResponseStream ();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader (dataStream);
// Read the content.
string responseFromServer = reader.ReadToEnd ();
// Display the content.
Console.WriteLine (responseFromServer);
// Clean up the streams.
reader.Close ();
dataStream.Close ();
response.Close ();

http://msdn.microsoft.com/en-us/library/debx8sh9.aspx

eduncan911
  • 17,165
  • 13
  • 68
  • 104
  • Thanks Eric. How does that associate the data to the 'p' id that it will be looking for? – Brian Apr 07 '09 at 17:17
  • The "string postData =" in the example above is the entire post data that you want to send. Think of postData as an encoded QueryString of name/value pairs. Since you are passing multiple name/value pairs, you have to combine them. I've modified the example above. – eduncan911 Apr 07 '09 at 17:38
  • OK so far so good, but how do I make further requests while remaining logged in?? – Shimmy Weitzhandler Jun 13 '13 at 00:44
  • All depends on the authorization mechanism. For example, if using ASP.NET FormAuthentication, you can retrieve the cookie that is set on the login. Then, for each submission going forward, you would always include that cookie on the WebRequest object. If memory serves, it's some kind of CookieContainer on the WebRequest (which itself is just a collection of NVP, aka Cookies). If using a form of querystring sessions (e.g. PHP sessions), you'll need to capture the querystring var and include it on each WebRequest to "stay logged in". – eduncan911 Jun 13 '13 at 01:03
0

These things have a habit of becoming more and more complex, for example should you need to handle cookies, authentication or multipart form uploads for uploading files etc. I suggest using curl (http://sourceforge.net/projects/libcurl-net/)

wentbackward
  • 546
  • 3
  • 11
0

Something like this:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
string data = "&p=" + dataThatNeedsToBeInTextArea;
byte[] byteArray = Encoding.UTF8.GetBytes (data);
req.ContentLength = byteArray.Length;
Stream stream= req.GetRequestStream ();
stream.Write (byteArray, 0, byteArray.Length);
stream.Close ();
StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream());
string response = streamIn.ReadToEnd();
streamIn .Close(); 
BFree
  • 102,548
  • 21
  • 159
  • 201
0

Agreeing with @wentbackward, WatiN is another alternative.

Community
  • 1
  • 1
Adam Neal
  • 2,147
  • 7
  • 24
  • 39