远程服务器返回错误:(500)内部服务器错误。 GetRequest()C#

时间:2011-09-01 13:22:35

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

我自己试图解决这个问题,但我无法得到任何有用的解决方案。我想向网站发送请求并获得处理结果。我已经遇到过这方面的问题(见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)内部服务器错误。

你能做些什么来阻止这种情况吗?

如果您想手动输入网站:

数据集的文本区域:SGSLDSELSVSPKRNSISRTH

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

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

4 个答案:

答案 0 :(得分:5)

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

内容类型:

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

POST:

-----------------------------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>

答案 1 :(得分:1)

我设置了UserAgent并解决了我的问题。

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

https://github.com/omarwagih/motifx

祝你好运。