2012-01-09 15 views
2

を実行する.dllと書いています。 はそうするためには、私はこのクラスを作成しました:POSTとGET Libの問題

public class BDCWebRequests 
{ 
    // private attributes 
    private static CookieContainer m_CookieJar; 
    private static HttpWebRequest m_HttpWebRequest; 
    private static string   m_defaultUserAgent  = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1"; 
    private static string   m_defaultContentType = "application/x-www-form-urlencoded"; 

    // Public Properties 
    public HttpWebRequest InternalWebRequest 
    { 
     get { return m_HttpWebRequest; } 
    } 

    /// <summary> 
    /// Class Constructor 
    /// </summary> 
    public BDCWebRequests() 
    { 
     m_CookieJar = new CookieContainer(); 
    } 

    // Methods Come Here... 
} 

私が達成しようとしていますどのような適切に「InternalWebRequest」プロパティを使用して要求を設定するには、このLIBのユーザーのための方法です。

使用量がこのようなものになるだろう。そうした後

BDCWebRequests myInstance = new BDCWebRequests(); 
myInstance.InternalWebRequest.Referer = "refererUrl"; 
myInstance.AllowAutoRedirect   = true; 
myInstance.Host      = "hostUrl"; 

、(ここでは例としてGETがある)Posts and Get Methodsがある

public string Get(string url) 
    { 
     try 
     { 
      // Creating instance of HttpWebRequest based on URL received 
      m_HttpWebRequest = (HttpWebRequest) WebRequest.Create (url); 

      m_HttpWebRequest.Method      = "GET"; 
      m_HttpWebRequest.UserAgent      = m_defaultUserAgent; 

      // Execute web request and wait for response 
      using (HttpWebResponse resp = (HttpWebResponse) m_HttpWebRequest.GetResponse()) 
      { 
       return new StreamReader(resp.GetResponseStream()).ReadToEnd(); 
      } 

     } 
     catch (Exception ex) 
     { 
      LogWriter.Error(ex); 
     } 

     return String.Empty; 
    } 

用途:

myInstance.Get("UrlForTheRequest"); 

主な問題: ユーザーがGETまたはPOSTを実行した後で、パブリックプロパティを使用してHttpWebRequestの内部インスタンスの属性を変更しようとすると、問題が発生します。

例えば、ユーザがGETを呼び出し、その後、彼はしようとした場合:

myInstance.InternalWebRequest.Host = ""、例えば、それはエラーがスローされます。 "this property cannot be set after writing has started"

ように論理的にそれを実装する方法の任意のアイデアを 2 - 以前に設定されたリクエストを使用して取得と送信を実行しますか?

ご迷惑をおかけして申し訳ありませんが、忍耐力に感謝します。 TL:DR :)

答えて

1

シンプル:リクエストを送信した瞬間、レスポンスから必要なすべてのデータを読み取り、新しいリクエストを作成し、古いリクエストから関連するすべてのパラメータをそれ。

+0

GETメソッドまたはPOSTメソッドの最後には、 同じURLで新しいリクエストを作成し、属性として保存されている古いリクエストを上書きしますか? また、私のHttpWebRequestのすべての属性を反復処理できる方法はありますか?私は "if(request.attrName!= null)にしてから新しいものにコピーしたくありません" –

+0

リフレクションを使ってすべての属性を反復処理できます。具体的には、request.GetType()。GetProperties()メソッドを使用します。 – Svarog

+0

また、ほとんどのWebRequestプロパティは単純にHTTPヘッダーなので、Headersプロパティをコピーすると、すでにほとんどの作業が完了しています。 – Svarog