加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – asp.net mvc应用程序中的Web浏览器托管问题

发布时间:2020-12-16 03:45:10 所属栏目:asp.Net 来源:网络整理
导读:在我的Asp.Net MVC Web应用程序中,我必须通过网站从站点获取数据.对于报废数据,我需要登录该站点,然后通过单击菜单选项卡访问站点,然后从该页面我需要废弃数据.报废的网站包含2个框架.我之前通过 Windows Web浏览器控件在我的一个Windows项目中实现了Web报废
在我的Asp.Net MVC Web应用程序中,我必须通过网站从站点获取数据.对于报废数据,我需要登录该站点,然后通过单击菜单选项卡访问站点,然后从该页面我需要废弃数据.报废的网站包含2个框架.我之前通过 Windows Web浏览器控件在我的一个Windows项目中实现了Web报废.

我按照以下link将Web浏览器控件集成到我的Web应用程序中.在视觉工作室环境下一切正常,我通过网络浏览器从网站上删除我的数据.但是当我尝试托管应用程序时,它没有按预期工作. Web浏览器控件未加载.我搜索了解决方案,但还没有得到可行的解决方案.我试图通过iframe实现相同的功能,并使用Silverlight Webbrowser控件和使用javascript来实现登录事件,但由于跨域问题,它也因访问拒绝而失败.

那么有没有办法通过loggin将数据废弃到asp.net web应用程序中的站点.我可以将我的Windows应用程序作为ActiveX控件使用它. ActiveX会有跨浏览器问题吗?

任何帮助将不胜感激

提前致谢

解决方法

正如评论中所建议的那样,使用网络浏览器的方法似乎很重,并且会受到其他环境限制.您最好的方法是创建一个单独的,可测试的存储库来抓取数据 – 如果您确实需要,可以按需或使用蜘蛛方法(并且目标数据不会更改).

是的,如果您尝试将其设为ActiveX,则不同的浏览器会出现问题.安全可能不允许.这里有很多因素;如果您的环境不受控制,这不是一个很好的选择.

假设您采用按需方法,我强烈建议您创建一个可以参考的Web服务或类.然后,您可以使用开源解析器服务器端,例如:

> CsQuery如果文件格式不正确,或者,
> Fizzler如果您可以信任文件的完整性.

基本上,您需要进行身份验证,存储身份验证cookie,最后通过填充了身份验证cookie的第二个请求加载目标文档.将该页面提供给您的解析器(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,data.Length);
        }
        catch (Exception e)
        {
            _logger.Error("Error in login attempt.",e);
        }
        finally
        {
            requestStream.Close();
        }
    }
    return request;
}

返回的cookie容器将具有一个您需要解析的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;
}

我希望这有帮助.这里有一些活动部分,但您可能期望已经考虑到任务的性质.

干杯.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读