Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера. GetRequest () C # - PullRequest
2 голосов
/ 01 сентября 2011

Я пытался понять это сам, но не могу найти какое-либо полезное решение. Я хочу отправить запрос на сайт и получить обработанные результаты. У меня уже была проблема с этим (см. Как мне заполнить форму веб-сайта и получить результат в 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 ]

5 голосов
/ 01 сентября 2011

Если вы посмотрите на документацию , то увидите, что для отправки данных "multipart / form-data" "POST" сильно отличается от "application / x-www-form-urlencoded". Для вашего случая вы должны отправить что-то вроде этого:

Content-Type:

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

эти ссылки могут помочь вам при отправке данных в этом формате, но в вашем случае вам следует избегать отправки файла:

РАЗМЕЩЕНИЕ MULTIPART / ФОРМАТИЧЕСКИХ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ .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 голос
/ 09 сентября 2012

Я установил UserAgent и моя проблема решена.

 request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)";
0 голосов
/ 09 ноября 2014

Я предполагаю, что вы пытаетесь получить доступ к motif-x программно.В R реализована версия, которую вы можете использовать:

https://github.com/omarwagih/motifx

Удачи.

0 голосов
/ 02 сентября 2011

Большое спасибо за вашу помощь! Я мог бы заставить его работать со следующим кодом на случай, если кто-то еще столкнется с этой проблемой:

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