【问题标题】:The remote server returned an error: (500) Internal Server Error. GetRequest() C#远程服务器返回错误:(500) 内部服务器错误。获取请求() C#
【发布时间】:2011-09-01 13:22:35
【问题描述】:

我试图自己解决这个问题,但我找不到任何有用的解决方案。我想向网站发送请求并获得处理后的结果。我已经遇到了这个问题(请参阅How do I fill in a website form and retrieve the result in C#?),但我能够通过那里所述的网站解决它。现在我正在尝试使用以下代码访问另一个网站 (http://motif-x.med.harvard.edu/motif-x.html):

ServicePointManager.Expect100Continue = false;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://motif-x.med.harvard.edu/cgi-bin/multimotif-x.pl");
request.Credentials = CredentialCache.DefaultCredentials;
request.ProtocolVersion = HttpVersion.Version10; // Motif-X uses HTTP 1.0
request.KeepAlive = false;
request.Method = "POST";
string motives = "SGSLDSELSVSPKRNSISRTH";
string postData = "fgdata=" + motives + "&fgcentralres=S&width=21";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "multipart/form-data";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();

WebResponse response = request.GetResponse();

这给了我以下例外:

远程服务器返回错误:(500) Internal Server Error.

有什么办法可以防止这种情况发生吗?

如果您想手动输入网站内容:

数据集的文本区域:SGSLDSELSVSPKRNSISRTH

中心字符(在基本选项中):S

您将被重定向到结果的网站 - 处理可能需要一段时间。这真的是异常的原因吗?

【问题讨论】:

  • Setting System.Net.ServicePointManager.Expect100Continue doesn't work for HTTP 1.0 requests:“即使此属性设置为 true,HTTP 1.0 请求也不使用 100-Continue 行为。”。
  • 好吧,抱歉,这行来自我发现 HTTP 1.0 属性之前的内容。请忽略它。
  • 我尝试了网络表单,结果不仅仅是重定向,而是弹出/新窗口。我不确定 HttpWebRequest 是否可以处理这个问题,或者这是否会导致服务器端出错。

标签: c# .net exception-handling httpwebrequest internal-server-error


【解决方案1】:

如果您查看documentation,您会发现对于“multipart/form-data”发送数据,“POST”与“application/x-www-form-urlencoded”非常不同。对于您的情况,您必须发送如下内容:

内容类型:

Content-Type: multipart/form-data; boundary=---------------------------7db1af18b064a

发布:

-----------------------------7db1af18b064a
Content-Disposition: form-data; name="fgdata"

SGSLDSELSVSPKRNSISRTH
-----------------------------7db1af18b064a
Content-Disposition: form-data; name="fgcentralres"

S
-----------------------------7db1af18b064a
Content-Disposition: form-data; name="width"

21
-----------------------------7db1af18b064a--

这些链接可以帮助您发送这种数据格式,但在您的情况下,您应该避免发送文件:

POSTING MULTIPART/FORM-DATA USING .NET WEBREQUEST

http://www.groupsrv.com/dotnet/about113297.html

使用一些 HTTP 分析器,您可以通过这个简单的 HTML 代码检查发送数据

<html>
<body>
<form action="http://motif-x.med.harvard.edu/cgi-bin/multimotif-x.pl" enctype="multipart/form-data" method="post">
   <input type="text" name="fgdata" value="SGSLDSELSVSPKRNSISRTH" /><br />
   <input type="text" name="fgcentralres" value="S" /><br />
   <input type="text" name="width" value="21" /><br />

   <input type="submit" value="Send" />
 </form>
</body>
</html>

【讨论】:

  • 感谢您的回复。该请求正在运行,但现在我遇到的问题是我需要从提交后打开的弹出窗口中获取结果。有没有办法做到这一点?问题是弹出窗口有一个由日期和某种哈希码组成的 URL。你能以某种方式得到那个地址吗?
  • 1 - 如果答案解决了您应该接受的问题。 2 - 对于您的新问题,我需要更多信息。您可以使用工具 Fiddler2 查看流量并查看它如何调用另一个 url 或解析响应并查看数据是否要调用另一个窗口。
  • 1 - 完成 :) 2 - 我按照您的建议使用 Fiddler,发现有一个指向结果页面的 href。它现在正在工作。非常感谢您的帮助!!
  • 非常感谢 andres descalzo。这对我有帮助
【解决方案2】:

我设置了 UserAgent,我的问题就解决了。

 request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)";

【讨论】:

    【解决方案3】:

    非常感谢您的帮助!我可以使用以下代码使其工作,以防其他人遇到此问题:

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
                            "http://motif-x.med.harvard.edu/cgi-bin/multimotif-x.pl");
    request.ProtocolVersion = HttpVersion.Version10;
    request.Method = "POST";
    string boundary = "---------------------------7db1af18b064a";
    string newLine = "\r\n";
    string postData = "--" + boundary + newLine +
                      "Content-Disposition: form-data; name=\"fgdata\"" + newLine + newLine + "SGSLDSELSVSPKRNSISRTH" + newLine +
                      "--" + boundary + newLine +
                      "Content-Disposition: form-data; name=\"fgcentralres\"" + newLine + newLine + "S" + newLine +
                      "--" + boundary + newLine +
                      "Content-Disposition: form-data; name=\"width\"" + newLine + newLine + "21" + newLine +
                      "--" + boundary + "--";
    
    byte[] byteArray = Encoding.UTF8.GetBytes(postData);
    request.ContentType = "multipart/form-data; boundary=" + boundary;
    request.ContentLength = byteArray.Length;
    Stream dataStream = request.GetRequestStream();
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();
    
    using (WebResponse response = request.GetResponse())
    using (Stream resSteam = response.GetResponseStream())
    using (StreamReader sr = new StreamReader(resSteam))
        File.WriteAllText("SearchResults.html", sr.ReadToEnd());
    System.Diagnostics.Process.Start("SearchResults.html");
    

    【讨论】:

      【解决方案4】:

      我假设您正在尝试以编程方式访问motif-x。您可以使用 R 中的实现版本:

      https://github.com/omarwagih/motifx

      祝你好运。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        相关资源
        最近更新 更多