开发者

C#: Open a browser and POST to a url from a windows desktop app

开发者 https://www.devze.com 2022-12-14 04:10 出处:网络
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 me

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 experime开发者_运维技巧nted 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?


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


Use the WebBrowser Class instead.


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();


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消