2

我試圖弄清楚自己,但我無法得到任何有用的解決方案。我想向網站發送請求並獲取處理結果。我已經遇到了一個問題(請參閱How do I fill in a website form and retrieve the result in C#?),但我可以通過該網站所述的網站解決問題。現在,我想用下面的代碼來訪問另一個網站(http://motif-x.med.harvard.edu/motif-x.html):遠程服務器返回錯誤:(500)內部服務器錯誤。 GetRequest()C#

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

這使我有以下異常:

The remote server returned an error: (500) Internal Server Error.

有什麼可以做,以避免這種情況?

文本區域爲數據集:SGSLDSELSVSPKRNSISRTH

中心人物(在基本選項):S

你會得到如果你想進行手動輸入到網站

重定向到結果的網站 - 可能需要一段時間才能處理。這可能是這個例外的原因嗎?

+0

設置'System.Net.ServicePointManager.Expect100Continue' [不適用於HTTP 1.0請求](http://msdn.microsoft.com/zh-cn/library/system.net.servicepointmanager.expect100continue.aspx) :「即使此屬性設置爲true,100繼續行爲也不用於HTTP 1.0請求。」 – Filburt

+0

對不起,這條線是從我發現HTTP 1.0屬性之前。請忽略它。 – Anna

+0

我試過網頁表單,結果不僅僅是一個重定向,而是一個彈出窗口/新窗口。我不確定HttpWebRequest是否可以處理這個問題,或者如果這可能導致服務器端發生錯誤。 – Filburt

回答

6

如果你看看documentation,你可以看到,對於「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-- 

這些鏈接可以幫助您發送該數據的格式,但在你的情況應該避免發送文件:

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

謝謝你的回覆。請求正在工作,但現在我遇到了問題,我需要從提交後打開的彈出窗口中獲取結果。有沒有辦法做到這一點?問題是彈出窗口有一個由日期和某種哈希碼組成的URL。你能以某種方式得到那個地址嗎? – Anna

+0

1 - 如果答案解決了您應該接受的問題。 2 - 爲你的新問題,我需要更多的信息。您可以使用工具Fiddler2查看流量並查看它如何調用另一個url或解析響應,並查看數據是否要調用其他窗口。 –

+0

1 - 完成:) 2 - 我遵循您使用Fiddler的建議,我發現有一個href導致結果頁面。現在正在工作。非常感謝你的幫助!! – Anna

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

我設置UserAgent並解決了我的問題。

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