2

私はこれを自分で理解しようとしましたが、有用な解決策が得られません。Web サイトにリクエストを送信し、処理された結果を取得したいと考えています。私はすでにこれに問題を抱えていました ( How do I fill in a website form and retrieve the result in C#? を参照してください) が、そこに記載されている Web サイトで解決できました。次のコードを使用して、さらに別の Web サイト ( 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

4 に答える 4

5

ドキュメントを見ると、「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--

これらのリンクは、このデータ形式を送信するのに役立ちますが、あなたの場合、ファイルを送信しないでください:

.NET WEBREQUEST を使用した MULTIPART/FORM-DATA の投稿

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>
于 2011-09-01T14:37:27.687 に答える
1

UserAgentを設定し、問題を解決しました。

 request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)";
于 2012-09-08T23:37:52.283 に答える
0

プログラムで Motivation-x にアクセスしようとしていると思います。使用できる R に実装されたバージョンがあります。

https://github.com/omarwagih/motifx

幸運を。

于 2014-11-09T01:58:08.143 に答える
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");
于 2011-09-02T08:43:41.180 に答える