C#在默认浏览器中打开带有帖子数据的网页

时间:2012-04-10 14:51:11

标签: c# http-post

我确信这肯定已经得到了回答,但我无法找到解决方案,所以我认为我可能会误解其他人的解决方案或试图做一些愚蠢的事情,但我们走了。

我正在C#中编写outlook 2010的加载项,用户可以单击功能区中的按钮并将电子邮件内容提交到网站。当他们点击按钮时,网站应该在默认浏览器中打开,从而允许他们查看刚刚提交的内容并在网站上与之交互。我可以使用以下网址中的查询字符串来执行此操作:

System.Diagnostics.Process.Start("http://www.test.com?something=value");

但是可以提交的数据量和凌乱的网址限制使我无法完成这种方法。我想使用http帖子,因为它显然更合适。但是,我发现这样做的方法似乎并没有在提交帖子数据后在浏览器中打开页面:

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

总结;用户需要能够单击Outlook功能区中的按钮,打开Web浏览器并显示通过邮件提交的电子邮件内容。

修改

是的,我找到了一种方法,它非常难看,但它的确有效!只需创建一个临时的.html文件(然后按上面启动),其中包含一个包含所有数据隐藏字段的表单,并使用javascript在页面加载时提交。

我真的不喜欢这个解决方案,因为它依赖于javascript(我只提供了一个提交按钮),看起来有点像一个小屋,所以我仍然希望有人能在这里找到更好的东西。

3 个答案:

答案 0 :(得分:2)

我不确定我是否会以这种方式构建解决方案。相反,我会将所有数据发布到Web服务(使用HttpWebRequest,如@Loci所描述,或者只是使用Visual Studio导入服务),这会将数据存储在数据库中(可能具有挂起状态)。然后将用户(使用您的Process.Start方法)指向显示待处理帮助票证的页面,这将允许他们批准或放弃票证。

这听起来有点像工作,但它应该清理你想要做的事情的架构。此外,您还可以享受额外的好处,即不必担心如何从客户端触发表单帖子。

修改

plain ASMX web service至少应该让你入门。您可以右键单击项目并选择“添加服务引用”以生成用于调用服务的代理代码。

答案 1 :(得分:2)

Dropbox客户端以您在编辑中提到的相同方式执行此操作。但它也会进行一些混淆,即它使用通过URL提交的哈希对数据进行异或。

以下是Dropbox如何执行此操作的步骤:

  1. in-app:创建一个可用于在dropbox.com上进行授权的令牌。
  2. in-app:将令牌转换为十六进制字符串(A)。
  3. in-app:创建一个相同长度的安全随机十六进制字符串(B)。
  4. in-app:计算C = A XOr B。
  5. in-app:使用以下功能创建临时HTML文件:
    1. 包含值B的隐藏输入字段。
    2. 提交表单,其中包含登录dropbox.com所需的隐藏输入字段。
    3. 一个从URI读取哈希的JS函数,用B对它进行异或,并将结果写入提交表单隐藏字段。
    4. 从URI中删除哈希。
    5. 提交表格。
  6. in-app:使用标准浏览器打开临时HTML文件,并将C作为哈希添加到URI的末尾。
  7. 现在,如果您的浏览器打开HTML文件,它会从隐藏的输入字段和URI中的哈希计算身份验证令牌并打开dropbox.com。因为5.4点。你无法点击浏览器中的后退按钮再次登录,因为哈希消失了。

答案 2 :(得分:1)

这已经晚了八年,但这里有一些代码很好地说明了这个过程:

string tempHTMLLocation = "some_arbitrary_location" + "/temp.html";
string url = https://your_desired_url.com";

    // create the temporary html file
    using (FileStream fs = new FileStream(tempHTMLLocation, FileMode.Create)) { 
        using (StreamWriter w = new StreamWriter(fs, Encoding.UTF8)) { 
            w.WriteLine("<body onload=\"goToLink()\">");
            w.WriteLine("<form id=\"form\" method=\"POST\" action=\"" + url + "\">");
            w.WriteLine("<input type=\"hidden\" name=\"post1\" value=\"" + post_data1 + "\">");
            w.WriteLine("<input type=\"hidden\" name=\"post2\" value=\"" + post_data2 + "\">");
            w.WriteLine("</form>");
            w.WriteLine("<script> function goToLink() { document.getElementById(\"form\").submit(); } </script>");
                        w.WriteLine("</body>");
        } 
    }

    // launch the temp html file
    var launchProcess = new ProcessStartInfo {
        FileName = tempHTMLLocation,
        UseShellExecute = true
    };
    Process.Start(launchProcess);

    // delete temp file but add delay so that Process has time to open file
    Task.Delay(1500).ContinueWith(t=> File.Delete(tempHTMLLocation));

打开页面后,onload() JS 脚本立即提交表单,该表单将数据发布到 url 并在默认浏览器中打开。