tags:

views:

260

answers:

4

I have a small WPF app (although I guess it doesn't really matter whether it's a wpf form or a webform app?) that I want to have launch a new browser window and POST to a specific url. I've been messing around with:

System.Diagnostics.Process.Start("http://myurl.com");

to launch the window but I don't think I can use the same process to actually post to a url...I've also experimented with HttpWebRequest but I would like the user to be able to use the app after I have posted to this url, not just show them the results...What can I look at to able to do something like this?

+2  A: 

There is no direct way to do it. What you could do is generate a HTML page with a form filled with the data you need to post, and a bit of javascript to post the page automatically when it is loaded. Then you just have to open that page in the browser...

The generated HTML could look like that :

<html>
<head>
<script language="Javascript">
function submitForm() {
    var theForm = document.getElementById("theForm");
    theForm.submit();
}
</script>
</head>
<body onload="submitForm()">
<form id="theForm" action="http://myurl.com" method="POST">
    <input type="text" name="username" value="myusername"/>
    <input type="password" name="password" value="mypassword"/>
</form>
</body>
</html>

If the page must be displayed in your application, load it in a WebBrowser control

Thomas Levesque
+4  A: 

Use the WebBrowser Class instead.

John Saunders
http://msdn.microsoft.com/en-us/library/cc491275.aspx
John Saunders
Yep. Here's how: http://stackoverflow.com/questions/1705201/how-to-open-ie-with-post-info-in-csharp
urig
+1  A: 

You can create a hidden WebBrowser control and do Navigate() (using the overload that allows you to specify the request method). You will need to specify a "_blank" target frame to cause the navigation to happen in a new browser window.

Franci Penov
+1  A: 

There are multiple solutions, not sure which one would be the best for you...

  1. Proceed with your original approach
  2. Embed web browser control in your applicaiton as suggested in other answers
  3. Do everything programmatically "behind the scene"

For #3 you may want to look here: http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

If you want to go with #1 - it is more tricky, since you need to control external application and different browsers would behave differently.

I've used "javascript:" protocol and the code below with IE as default browser when dealing with one "user-unfriendly" application. Please note that it's not "production-ready" code. There is no error handling, user may shift focus away from launched browser, or use browser without "javascript:" protocol support etc.

static void Main()
{
    Settings s = Settings.Default;
    Process.Start(s.URL1);
    Thread.Sleep(s.Delay1);
    SendKeys.SendWait("%D");
    Thread.Sleep(100);
    SendKeys.SendWait(EncodeForSendKey(s.URL2));
    SendKeys.SendWait("{ENTER}");
}

public static string EncodeForSendKey(string value)
{
    StringBuilder sb = new StringBuilder(value);
    sb.Replace("{", "{{}");
    sb.Replace("}", "{}}");
    sb.Replace("{{{}}", "{{}");
    sb.Replace("[", "{[}");
    sb.Replace("]", "{]}");
    sb.Replace("(", "{(}");
    sb.Replace(")", "{)}");
    sb.Replace("+", "{+}");
    sb.Replace("^", "{^}");
    sb.Replace("%", "{%}");
    sb.Replace("~", "{~}");
    return sb.ToString();
}
  • URL1: http://www.google.com
  • URL2: javascript:function x(){document.all.q.value='stackoverflow';document.forms[0].submit();} x();
DK
Awesome, thanks for all the info - I'm trying out #1...
onekidney