2015-03-31 96 views
0

我試圖做一個應用程序,將發送一個POST請求https://owlexpress.kennesaw.edu/prodban/bwckschd.p_get_crse_unsec與一些信息並返回一個類列表。C#HttpClient不發送POST變量

你可以去這裏通過搜索「我正在使用2015年秋季,數學,課程1190」。 https://owlexpress.kennesaw.edu/prodban/bwckschd.p_disp_dyn_sched

當我運行下面的代碼時,它輸出它返回到一個字符串,它將進入一個webbrowser組件。它顯示:

Class Schedule Search  
Fall Semester 2015 
Mar 31, 2015 
Stop You must select at least ONE subject . 

我使用Chrome的調試找到POST值,並將其設置爲它們是什麼,當我使用該網站正常。我甚至包含了一些cookie,以防需要它們。

編輯:

好的,新的問題。我用了一個可行的瀏覽器,並得到了這一點:「term_in = 201508 & sel_subj =假& sel_day =假& sel_schd =假& sel_insm =假& SEL_C放=假& sel_levl =假& sel_sess =假& sel_instr =假& sel_ptrm =虛設& sel_attr = d ummy & sel_subj = MATH & sel_crse = 1190 & sel_title = & sel_insm =%25 & sel_from_cred = & sel_to_cr ED = & sel_camp =%25 & sel_levl =%25 & sel_ptrm =%25 & sel_instr =%25 & begin_hh = 0 & begin_mi = 0 &是gin_ap =一個& end_hh = 0 & end_mi = 0 & end_ap =一個」

我不能發送,但因爲是使用了一些名字兩次,像sel_subj(那些是我的字典中的鍵值)

代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.Net.Http; 
using System.Net; 

namespace ClassChecker 
{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    methods methods1 = new methods(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    {    
     string temp = methods1.getData2(); 
     Console.ReadLine(); 
     webBrowser.NavigateToString(temp);    
    } 
} 


public class methods 
{ 

    public string getData2() 
    { 
     var cookieContainer = new CookieContainer(); 
     using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer }) 
     using (var client = new HttpClient(handler)) 
     { 
      client.BaseAddress = new Uri("https://owlexpress.kennesaw.edu"); 

      var values = new Dictionary<string, string> 
      { 
       { "sel_subj", "MATH" }, 
       { "term_in", "201508" }, 
       { "sel_day", "dummy"}, 
       { "sel_schd", "dummy"}, 
       { "sel_insm", "%"}, 
       { "sel_camp", "%"}, 
       { "sel_levl", "%"}, 
       { "sel_sess", "dummy"}, 
       { "sel_instr", "%"}, 
       { "sel_ptrm", "%"}, 
       { "sel_attr", "dummy"},     
       { "sel_crse", "1190" }, 
       { "sel_title", "" }, 
       { "sel_from_cred", "" }, 
       { "sel_to_cred", "" }, 
       { "begin_hh", "0" }, 
       { "begin_mi", "0" }, 
       { "begin_ap", "a" }, 
       { "end_hh", "0" }, 
       { "end_mi", "0" }, 
       { "end_ap", "a" } 

      }; 
      var content = new FormUrlEncodedContent(values); 

      cookieContainer.Add(client.BaseAddress, new Cookie("SESSID", "MFlIU0VSMTgxNjYx")); 
      cookieContainer.Add(client.BaseAddress, new Cookie("BIGipServerowlexpress-all", "2239289986.0.0000")); 

      client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/html")); 
      var result = client.PostAsync("/prodban/bwckschd.p_get_crse_unsec", content).Result; 
      string resultContent = result.Content.ReadAsStringAsync().Result;     
      MessageBox.Show(result.Headers.ToString()); 
      return resultContent; 
     } 

    } 

} 

} 
+0

你能夠確認(例如與Fiddler)表單POST params不會正確地出去嗎?問題可能只是你在請求內容中有錯誤,而不是請求中的代碼... – 2015-03-31 18:56:44

+0

@JimW我在小提琴手中發現了這個,所以我猜這是發給他們的「sel_subj = MATH&term_in = 201508&sel_day = dummy&sel_schd =虛設&sel_insm =%25&sel_camp =%25&sel_levl =%25&sel_sess =虛設&sel_instr =%25&sel_ptrm =%25&sel_attr =虛設&sel_crse = 1190&sel_title =&sel_from_cred =&sel_to_cred =&begin_hh = 0&begin_mi = 0&begin_ap = A&end_hh = 0&end_mi = 0&end_ap =一個」 – Jrow 2015-03-31 19:05:39

+0

好的,新的問題。我用了一個可行的瀏覽器,並得到這個: 「term_in = 201508&sel_subj =啞sel_day =啞sel_schd =啞sel_insm =啞sel_camp =啞sel_levl =啞sel_sess =啞sel_instr =啞sel_ptrm =啞sel_attr =啞sel_subj =數學與sel_crse = 1190 sel_title = sel_insm =%25&sel_from_cred = sel_to_cred = sel_camp =% 25&sel_levl =%25&sel_ptrm =%25&sel_instr =%25&begin_hh = 0&begin_mi = 0&begin_ap = a&end_hh = 0&end_mi = 0&end_ap = a「 雖然我不能發送,因爲是兩次使用某些名稱,比如sel_subj(並且這些都是我的鍵值字典)。 – Jrow 2015-03-31 19:12:59

回答

2

根據我們在評論的討論,你正在發佈到服務需要一組與「虛擬」的價值觀和其它參數一套ame具有真正的價值。

如果您將NameValueCollection用於進入FormUrlEncodedContent構造函數的參數,您將能夠使用重複鍵。它應該然後工作

+0

感謝您的幫助,我添加了所有的虛擬類型,它的工作原理! – Jrow 2015-03-31 20:36:41