2013-07-18 76 views
6

在我的Asp.Net MVC網絡應用程序中,我必須通過網站從網站獲取數據。爲了報廢數據,我需要登錄到站點,然後通過點擊菜單標籤到達站點,然後從該頁面我需要取消數據。報廢的站點包含2個框架。我以前通過Windows Web瀏覽器控制在我的一個Windows項目中實現了網絡報廢。網頁瀏覽器在asp.net中的託管問題mvc applicaton

我遵循以下link將Web瀏覽器控件集成到我的Web應用程序。在Visual Studio環境下一切運行良好,並通過網絡瀏覽器從我的網站上獲取數據。但是,當我嘗試託管應用程序時,它無法按預期工作。 Web瀏覽器控件未加載。我尋找解決方案,但還沒有得到一個可行的解決方案。我試圖通過iframe實現相同的功能,並且通過使用Silverlight Webbrowser控件並使用JavaScript來調用登錄事件,但由於跨域問題導致訪問被拒絕,它也失敗了。

那麼有什麼辦法可以通過登錄到asp.net web應用程序中的網站來取消數據。我可以將我的Windows應用程序作爲ActiveX控件使用嗎? ActiveX是否存在跨瀏覽器問題?

任何幫助,將不勝感激提前

+0

你有沒有考慮過使用'System.Net.Http.HttpClient'或'System.Net.WebRequest'獲取所需內容? –

+0

是的,是的,我嘗試使用相同的,但它失敗了。我懷疑是因爲要報廢的網站包含多個框架? – BonDaviD

+0

您是否有可能創建一個單獨的應用程序來處理刮擦?然後將結果保存在數據庫或文本文件中,以便您的網站可以讀取。 – NoLifeKing

回答

0

正如意見建議

感謝,使用網頁瀏覽器的做法似乎很重,會受到其他環境的限制。您最好的方法是創建一個單獨的可測試存儲庫來抓取數據 - 如果您確實需要(並且目標數據不會更改),則可以按需提供或使用spider方法。

是的,如果你嘗試使它成爲ActiveX,不同的瀏覽器會遇到問題。安全性可能不允許。這裏有很多因素。如果你的環境不受控制,這不是一個好的選擇。

假設你用按需方式去,我會強烈建議創建一個可以引用的web服務或類。然後,您可以使用一個開源的解析服務器端,如:

  1. CsQuery如果沒有很好地形成文件,或
  2. Fizzler,如果你可以信任的文檔的完整性。

基本上,您需要進行身份驗證,存儲您的身份驗證Cookie,並最終通過填充身份驗證Cookie的第二個請求加載目標文檔。 Feed 頁面添加到您的解析器(CsQuery或Fizzler)中。

進行登錄將如下的例子:

private HttpWebRequest PerformLoginRequest(CookieContainer container) 
{ 
    var request = (HttpWebRequest) WebRequest.Create(YOUR_POST_URL); 
    request.Method = "POST"; 
    request.CookieContainer = container; 

    _logger.DebugFormat("Attempting login for '{0}'", _username); 
    var encoding = new ASCIIEncoding(); 

    // assumes the un/pw is stored in a field 
    var credentials = string.Format("username={0}&password={1}", _username, _password); 
    byte[] data = encoding.GetBytes(credentials); 

    request.ContentType = "application/x-www-form-urlencoded"; 
    request.ContentLength = data.Length; 

    using (var requestStream = request.GetRequestStream()) 
    { 
     try 
     { 
      requestStream.Write(data, 0, data.Length); 
     } 
     catch (Exception e) 
     { 
      _logger.Error("Error in login attempt.", e); 
     } 
     finally 
     { 
      requestStream.Close(); 
     } 
    } 
    return request; 
} 

說回來都會有一個Set-Cookie,你需要解析出來,以便後續請求有驗證位的餅乾的容器正確呈現。我必須這樣做,並且用我在這裏找到的某處代碼,但是現在找不到參考。它可能看起來是這樣的(解釋一下Set-Cookie):

private static CookieContainer ProcessCookieContainer(HttpWebRequest request, CookieContainer container) 
{ 
    var response = (HttpWebResponse) request.GetResponse(); 
    var cookierReader = new StreamReader(response.GetResponseStream()); 
    string htmldoc = cookierReader.ReadToEnd(); 

    var cookieHeader = response.GetResponseHeader("Set-Cookie"); 
    response.Close(); 

    container = new CookieContainer(); 
    foreach (var cookie in cookieHeader.Split(',')) 
    { 
     // these are ; seperated name/value pairs 
     var split = cookie.Split(';'); 
     string name = split[0].Split('=')[0]; 
     string value = split[0].Split('=')[1]; 

     // create the cookie with the domain 
     var c = new Cookie(name, value) {Domain = "YourCookieDomain.com"}; 

     container.Add(c); 
    } 
    return container; 
} 

並加載文檔解析它,你會做這樣的事情:

public string GetValueFromSomePage(int first, string second) 
{ 
    var container = new CookieContainer(); 

    // do login 
    var request = PerformLoginRequest(container); 

    // chew on cookies 
    container = ProcessCookieContainer(request, container); 

    var result = string.Empty; 
    var requestUrl = string.Format("http://YourUrlWithParams.com/?first={0}&second={1}", 123, "abc"); 
    var request = (HttpWebRequest)WebRequest.Create(requestUrl); 
    request.CookieContainer = container; 

    using (var serverResponse = (HttpWebResponse)request.GetResponse()) 
    { 
     try 
     { 
      var reader = new StreamReader(serverResponse.GetResponseStream()); 
      var responseDoc = new CQ(reader); 

      // do something with CSS selectors... 
      result = responseDoc["input[name=name]"].FirstElement().Value; 

     } 
     catch (Exception e) 
     { 
      _logger.Error("Error fetching data.", e); 
     } 
     finally 
     { 
      serverResponse.Close(); 
     } 
    } 

    return result; 
} 

我希望這有助於。這裏有幾個移動部件,但您可能期望已經考慮到您的任務的性質。

乾杯。