我确信这肯定已经得到了回答,但我无法找到解决方案,所以我认为我可能会误解其他人的解决方案或试图做一些愚蠢的事情,但我们走了。
我正在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(我只提供了一个提交按钮),看起来有点像一个小屋,所以我仍然希望有人能在这里找到更好的东西。
答案 0 :(得分:2)
我不确定我是否会以这种方式构建解决方案。相反,我会将所有数据发布到Web服务(使用HttpWebRequest,如@Loci所描述,或者只是使用Visual Studio导入服务),这会将数据存储在数据库中(可能具有挂起状态)。然后将用户(使用您的Process.Start方法)指向显示待处理帮助票证的页面,这将允许他们批准或放弃票证。
这听起来有点像工作,但它应该清理你想要做的事情的架构。此外,您还可以享受额外的好处,即不必担心如何从客户端触发表单帖子。
修改强>
plain ASMX web service至少应该让你入门。您可以右键单击项目并选择“添加服务引用”以生成用于调用服务的代理代码。
答案 1 :(得分:2)
Dropbox客户端以您在编辑中提到的相同方式执行此操作。但它也会进行一些混淆,即它使用通过URL提交的哈希对数据进行异或。
以下是Dropbox如何执行此操作的步骤:
现在,如果您的浏览器打开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 并在默认浏览器中打开。