【问题标题】:ASPX website works locally, but not on the serverASPX 网站在本地工作,但不在服务器上
【发布时间】:2013-12-10 13:36:16
【问题描述】:

网站在本地工作,但在服务器上却不行。

我正在使用免费托管 somee.com

网站链接:http://multiple-search.somee.com/

本网站从文本框中获取搜索查询,并在 google、yahoo 等中进行搜索。 输入搜索查询并按下按钮时,我收到一条错误消息。错误是:

[Win32Exception (0x80004005): Access is denied]
System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo) +614
System.Diagnostics.Process.Start() +56
System.Diagnostics.Process.Start(ProcessStartInfo startInfo) +49
System.Diagnostics.Process.Start(String fileName) +31
_Default.Button1_Click(Object sender, EventArgs e) +159
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565

如何消除此错误?我的代码是:

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void TextBox1_TextChanged(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        // Getting Text from textbox
        string input = TextBox1.Text;

        //Parsing criteria: New Line 
        string[] lines = input.Split('\n');
        foreach (string ln in lines)
        {
            if (CheckBox1.Checked == true)
            {
                System.Diagnostics.Process.Start("https://www.google.com/#q=" + ln.Substring(0));
            }
            if (CheckBox2.Checked==true)
            {
                    System.Diagnostics.Process.Start("http://search.yahoo.com/search;_ylt=AmGbBTVg4RHlgJHNOZ4AaA2bvZx4?p=" + ln.Substring(0) + "&toggle=1&cop=mss&ei=UTF-8&fr=yfp-t-900");
            }
            if (CheckBox3.Checked == true)
            {
                System.Diagnostics.Process.Start("http://www.bing.com/search?q=" + ln.Substring(0) + "&go=&qs=n&form=QBLH&pq=chris+brown&sc=8-11&sp=-1&sk=");
            }
            if (CheckBox4.Checked == true)
            {
                System.Diagnostics.Process.Start("http://www.ask.com/web?q=" + ln.Substring(0) + "&search=&qsrc=0&o=0&l=dir");
            }
            if (CheckBox5.Checked == true)
            {
                System.Diagnostics.Process.Start("http://search.aol.com/aol/search?s_chn=prt_ct9&enabled_terms=&s_it=comsearch50ct17&q=" + ln.Substring(0));
            }
        }
    }
}

【问题讨论】:

  • 您介意发布错误消息吗,@arunelis?
  • 天哪,你真的使用Process.Start 来执行HTTP 请求吗?请查看 HttpWebRequest 类,它允许您发送任何 HTTP 请求并接收数据。无论如何,它所做的就是在服务器上打开一个新的浏览器窗口,这100% 不是你想在网络服务器上做的!
  • 伙计们,感谢您的回答,您回答了为什么它不起作用。我最终使用了 JavaScript 代码 >>> stackoverflow.com/questions/14547783/for-loop-opening-urls

标签: c# asp.net web-hosting


【解决方案1】:

我怀疑您的托管限制正在阻止

System.Diagnostics.Process.Start

【讨论】:

    【解决方案2】:

    我同意 Alex 的观点,即您的主机可能会限制启动新进程。大多数托管服务将拒绝允许访问本质上在其服务器上启动新应用程序的内容。

    除此之外,您的代码将无法正常工作。即使他们允许启动一个新流程,客户也永远不会看到结果。这将在服务器上打开新的浏览器窗口,而不是在客户端机器上。

    【讨论】:

      【解决方案3】:

      错误描述为:[Win32Exception (0x80004005): Access is denied]

      这是一个访问权限问题。要修复它,您可以授予 IIS 用户的管理员访问权限。虽然这不是一个好的解决方案。

      更好的解决方案是在有权运行可执行文件的用户下运行应用程序池,最好不是管理员级别的用户。

      最好不要启动浏览器,而是使用每个搜索引擎 API 来获取搜索结果并相应地显示它们......看看this tutorial on how to use GOOGLE and BINGs API

      【讨论】:

      • 是的,我同意上面的 Paul 评论。似乎是权限问题。请让您的提供商为您授予全部权限。
      【解决方案4】:

      Process.Start() 在服务器上启动一个进程。只要网络应用程序在您的计算机上运行,​​它就可以工作,但在托管环境中肯定会受到限制。

      【讨论】:

        【解决方案5】:

        IIS 在 AppPool 中使用的用户帐户没有启动新进程的权限。在本地运行时,该帐户可能是管理员或至少是用户级别的帐户。

        【讨论】:

          【解决方案6】:

          正如其他人所说,System.Diagnostics.Process 可能会受到限制。尝试以不同的方式执行此操作,例如使用 System.Net.Http.HttpClient

          【讨论】:

            【解决方案7】:

            不允许在服务器上运行进程。对于服务器端代码,尽管它只会打开一个窗口而不是所有搜索,但请尝试这样做:

            Server.Transfer("https://www.google.com/#q="  + ln);    // for Google
            

            要打开多个窗口/选项卡,我会改为查看客户端 JavaScript 代码。或者,您可以使用他们的 API 从 Google/Bing 等获取结果,并将它们合并在一起,如@Paul Zahra 的回答中所述。

            【讨论】:

            • 谢谢。我最终通过使用 JavaScript 代码得到了您的建议。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-04
            • 1970-01-01
            • 1970-01-01
            • 2014-11-16
            • 1970-01-01
            相关资源
            最近更新 更多