winform与web交互问题总结

最近做数据采集,碰到了很多钉子,这里一一记录下来。

很久没写东西了... ,不是没有写的,是没心情写,想的太多了,在想些什么,自己也说不清楚,往大了说关于人生,往小了说关于怎么活。扯远了,不废话了。

1、选择什么方式去采集?

网上方式很多WebClient,WebRequest和WebBroswer,分析需求之后选择 WebBroswer ,

原因有几点:

a、很多地方需要登陆之后才能采集,要做模拟登陆就会牵扯到状态保存问题等等

b、多级页面跳转,也需要模拟去触发点击事件

c、Ajax页面数据采集

2、WebBroswer 的加载状态问题,页面什么时候加载完?

WebBroswer 加载状态一个页面时候加载完 , 一开始是一个很头疼的问题 , 写了个Demo发单凭WebBrowser.ReadyState是不可靠的 , 有人直接延时,但延多少根本没办法确定。

后来测试发现WebBrowser_DocumentCompleted事件会重复触发,造成业务逻辑混乱,找到问题之后就好办了,用完就去掉它这个委托。

if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) return;

webBrowser1.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

3、如何查找某Html元素?

HtmlDocument hDoc  =  webBrowser1.Document;
            
for  ( int  i  =   0 ; i  <  hDoc.All.Count; i ++ )
            {
                
if  (hDoc.All[i].TagName.ToUpper().Equals( " INPUT " ))
                {
                    
if  (hDoc.All[i].GetAttribute( " type " ).Trim().Equals( " button " ))
                    {
                        hDoc.All[i].InvokeMember(
" click " ); //触发它的事件
                        
break ;
                    }
                }
            }

 

 4、如何获取Ajax页面动态加载的数据?

 if (WebBrowser.ReadyState != WebBrowserReadyState.Complete || WebBrowserst.StatusText != "完成" && !WebBrowser.IsBusy) return;

然后再用timer延时2秒去取WebBrowser.Document,就可以了

5、如何给WebBroswer加入内容?

 //例如注册脚本
HtmlElement ele = webBrowser1.Document.CreateElement("script");
ele.SetAttribute("type", "text/javascript");
ele.SetAttribute("text", "function aa(s){alert(s);}");
WebBrowser.Document.Body.AppendChild(ele);

6、如何调用WebBroswer加载页面内的Js方法?

WebBrowser.Document.InvokeScript("aa", new object[] {'Hi , daniel;!'});

7、采集回来的Html代码不完整或者对方的代码本来就有问题怎么办?

这里要去修复Html代码,我用的HtmlParser,但效率不怎么样,目前还没发现更好的!

8、页面弹出错误脚本怎么办?

这里要分清是网页弹出来的还是浏览器弹出来的,WebBrowser本省就是一个浏览器。

如果是网页弹出来的,可以通过注入脚本去覆盖原来的alert方法,如果是浏览器的可以把WebBrowser.ScriptErrorsSuppresse设为True.

9、文件下载弹出框怎么处理?

我的解决办法是采用系统API,去找到那个窗体然后去点击上面的某个按钮。

 

 

 

转载于:https://www.cnblogs.com/DanielChow/archive/2010/08/07/1794839.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整的服务端及客户端调用程序,在win7+ vs2015环境运行通过. 一、说明 1、创建winfrom应用程序;(或者是控制台项目) 2、在项目中添加一个WCF服务,并实现服务; 3、在需要启动WebService服务的地方启动该服务即可; 二、代码如下: 1、新建一个WCF服务——定义服务接口    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]     public interface ICalculator     {         [OperationContract]         double Add(double n1, double n2);     } 2、新建一个WCF服务——实现服务 public class CalculatorService : ICalculator     {         public double Add(double n1, double n2)         {             return n1 + n2;         }     } 3、添加完WcF服务后会在应用程序配置文件中有入下节点                             <!--TestServer.ICalculator服务定义的接口,根据自己定义进行修改-->                                                                   <baseAddresses> <!--这个是要发布的服务地址,可以进行修改-->                                   </baseAddresses>                   4、在要启动服务的地方启动服务监听   public frmMain() { InitializeComponent(); } private void frmMain_Load(object sender, EventArgs e) { try { //打开服务创建监听,并开始监听消息 ServiceHost serviceHost = new ServiceHost(typeof(Service1));//需要using System.ServiceModel; serviceHost.Open(); label1.Text = "服务启动正常"; } catch (Exception ex) { label1.Text = ex.Message; } } 5、下面可以在客户端通过上面的服务地址”http://xxx.xxx.xxx.xx:8733/test/Service1/“对服务进行调用 到这步就实现在控制台中实现webService的发布。
WinForm是一种用于创建Windows桌面应用程序的技术,而WebAPI是一种用于构建Web服务的框架。其中,WinForm主要用于创建具有图形用户界面(GUI)的桌面应用程序,而WebAPI主要用于创建基于HTTP协议的API服务。 在某些情况下,我们可能需要在WinForm应用程序中托管WebAPI。这种情况下,我们可以通过以下步骤完成: 1. 创建WinForm应用程序:首先,我们需要创建一个WinForm应用程序。这可以通过使用Visual Studio等开发工具来完成。 2. 添加WebAPI功能:接下来,我们需要添加WebAPI功能到我们的WinForm应用程序中。我们可以使用NuGet包管理器安装WebAPI相关的包,以便能够轻松地添加和使用WebAPI相关的功能。 3. 配置WebAPI路由:在使用WebAPI之前,我们需要配置WebAPI的路由。这可以通过在应用程序的启动代码中添加相关的路由配置来完成。路由配置用于将HTTP请求映射到相应的WebAPI控制器和操作方法。 4. 编写WebAPI控制器和操作方法:接下来,我们需要编写和实现相应的WebAPI控制器和操作方法。这些控制器和操作方法将用于处理WebAPI请求并返回相应的结果。 5. 启动WebAPI服务:最后,我们需要在WinForm应用程序中启动WebAPI服务。这可以通过在应用程序启动时开始监听相应的HTTP端口来完成。 通过以上步骤,我们就可以在WinForm应用程序中托管和使用WebAPI了。这样,我们就能够在桌面应用程序中提供基于HTTP协议的API服务,从而实现更多的功能和交互方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值