0

私はコンソールアプリケーションを入手して、既存のASP.NET Webアプリケーションでそれ自体を認証することができました。これは、(ブラウザが要求を行ったかのように)viewstate情報を含むログインページへのポストリクエストを作成することによって、ログインページを模倣します。コンソールのアプリケーションとタイムアウトからのASP.NETの承認

その後、CookieContainerで応答として返されたCookieをキャッチします。

その後、アプリケーションは同じページ(許可が必要)への複数のリクエストを行います。ページはいくつかの作業を行い、サーバー上にファイルを書き出します。

私が遭遇している問題は、偽のログイン後、最初の2つの要求は大丈夫です。第3の要求は決して応答を受信しません。

にログインするには:

private static CookieContainer PerformLoginRequest() 
{ 
    string loginURL = "http://www.myDomain.com/mySite/login.aspx"; 

    //Set up the request and give it a cookie container. 
    CookieContainer cookieJar = new CookieContainer(); 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(loginURL); 
    request.CookieContainer = cookieJar; 
    request.Method = "POST"; 
    request.ContentType = "application/x-www-form-urlencoded"; 

    //Grab the request body so we can put important information in it. 
    Stream requestBody = request.GetRequestStream(); 
    string postData = "__VIEWSTATE=GIBBERISH&UserName=USERNAME&Password=PASSWORD%21&LoginButton.x=0&LoginButton.y=0"; 

    //Throw the string into the body. 
    ASCIIEncoding encoding = new ASCIIEncoding(); 
    byte[] byte1 = encoding.GetBytes(postData); 
    requestBody.Write(byte1, 0, byte1.Length); 
    requestBody.Close(); 

    //Get the response to the login request. 
    WebResponse response = request.GetResponse(); 
    StreamReader reader = new StreamReader(response.GetResponseStream()); 
    string result = reader.ReadToEnd(); 
    reader.Close(); 

    return cookieJar; 
} 

をページを要求するには:

private static long RequestPage(string url) 
{ 
    //If we've already got a CookieContainer, then we've logged in already. Otherwise, log in. 
    if (cookieJar == null) 
    { 
     try 
     { 
      cookieJar = PerformLoginRequest(); 
     } 
     catch 
     { 
      throw; 
     } 
    } 

    //Set up the request. 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 
    request.CookieContainer = cookieJar; 
    request.Method = "GET"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.Timeout = timeout; //5 minutes. 

    WebResponse response = request.GetResponse(); 

    return response.ContentLength; 
} 

をCookieJar、タイムアウト変数は、アプリケーションに対してグローバルです以下は、私が要求を行うために使用しているコードがあります。

何が原因でしょうか?

アップデート(2010年1月17日、午前3時30分PM EST)

私はフィドラーランニングでアプリケーションを起動すると、すべてが正常に通過します。すべてのリクエストは、私が期待するように機能します。

IISログファイルを調べました。それらの中に私は初期ログインリクエスト、ログイン後のリダイレクト、最初の2ページのリクエストを見ることができます。しかし、その後は...何もない。リクエストはWebサーバーにさえしていないようです。

アップデート(2010年1月18日、11:29 AM EST)私はクリスB.ベーレンスによって提案された変更を反映するために、トップアップコードを更新

。しかし、役に立たない。それが重要な場合には、上記の関数を呼び出すループは次のようになります。

private static void RegenerateNecessaryForms(MyEntities context) 
{ 
    var items = context.Items.Where(i => i.NeedsProcessing == true); 

    var area = context.Areas; 
    foreach (Item i in items) 
    { 
     bool success = true; 
     foreach (Area area in areas) 
     { 
      try 
      { 
       string url = string.Format("http://{0}/mySite/process.aspx?item={1}&area={2}", targetDomain, i.ItemName, area.AreaName); 
       long result = RequestPage(url, m); 
      } 
      catch 
      { 
       success = false; 
      } 
     } 

     if (success) 
     { 
      i.NeedsProcessing = false; 
     } 
    } 
} 

アップデート(2010年1月18日、1:03 PM EST) これはおそらく、私がきた最も有用な情報であります今まで提供することができました。

IISログをもう一度見ていました。ログインリクエストが送信されると、ログをフラッシュしてすぐに表示されます。ただし、コンソールアプリケーションを終了するまで、ページリクエストは表示されません。ログの関連するビットは次のとおりです。

2011-01-18 17:44:54 X.X.X.X POST /MySite/login.aspx - 80 - X.X.X.X - 302 0 0 148 
2011-01-18 17:44:54 X.X.X.X GET /MySite/default.aspx - 80 AutomatedUser X.X.X.X - 200 0 0 48 
2011-01-18 17:54:33 X.X.X.X GET /MySite/process.aspx model=ITEM_ONE&area=US 80 AutomatedUser X.X.X.X - 200 0 995 579100 
2011-01-18 17:54:33 X.X.X.X GET /MySite/process.aspx model=ITEM_ONE&area=CANADA 80 AutomatedUser X.X.X.X - 200 0 995 553247 
2011-01-18 17:54:33 X.X.X.X GET /MySite/process.aspx model=ITEM_TWO&area=US 80 AutomatedUser X.X.X.X - 200 0 995 532824 

上記のRequestPageメソッドへの呼び出しは、それぞれprocess.aspxへのGET要求に対応しています。 "request.GetResponse();"という行は、たった10秒ほどかかりますが、アプリケーションを閉じるまで、要求は決して完了しません(少なくともIISによると)。 (各行の最後の数字を見ると、それはページを提供するのにかかった時間(ミリ秒単位)ですが、アプリケーションよりもずっと短い時間で応答が返されます。 )、IISは1つのIPから受け入れる接続の量を制限しています。

私には次のような質問があります。それが、私が作り出している要求については、それが彼らのように「開かれた」ままになってしまうのですか?

リクエストはHTMLページを返さない(問題がある場合)、PDFを返す。

+0

* 3番目のリクエストでは常に失敗していますか?ページや特定のページに失敗しますか? ASP.NET側からデバッグ/ログ記録できますか? –

+0

ええ、それは常に3番目のリクエストです。私はFiddlerを開いてアプリケーションを実行し、すべてうまくいった。私の理解が正しいとすれば、Fiddlerはプロキシとして機能するので、基本的に私の要求はWebブラウザから来ているかのようです。おそらく、サーバーは何らかの理由でアプリケーションから来たときにサーバーを拒否していますか?私はIISログファイルを見て、私が思いつくことができるものを見ていきます。その間、助けてくれてありがとう! –

+0

"okay"とは具体的にはどういう意味ですか?それが認証トークンのクッキーで応答しているのか、それともわずか200であるのでしょうか? –

答えて

0

あなたは明示的にリクエストを閉じていない:それはトリックを行う場合

//Get the response to the login request. 
WebResponse response = request.GetResponse(); 
StreamReader reader = new StreamReader(response.GetResponseStream()); 
string result = reader.ReadToEnd(); 

reader.Close(); 

return cookieJar; 

を参照してください。

+0

私はそのショットを与えた。残念ながら、私には何の根拠もありませんでした。 :(助けてくれてありがとう! –

関連する問題