C# HttpWebRequest 异步请求

同事古X强帮忙实现的一个功能,记录下来,方便以后查阅

异步请求:

//定义委托
public delegate void Asyncdelegate(WebProxy objName);

//异步调用完成时,执行回调方法
private void CallbackMethod(IAsyncResult ar)
{
	Asyncdelegate dlgt = (Asyncdelegate)ar.AsyncState;
	dlgt.EndInvoke(ar);
}

//异步调用Commit方法
public virtual void Run()
{
	Asyncdelegate isgt = new Asyncdelegate(Commit);
	IAsyncResult ar = isgt.BeginInvoke(null,new AsyncCallback(CallbackMethod),isgt);
}



HttpWebRequest请求:

//向APM接口提交数据
//为什么要用WebProxy,因为.Net 4.0以下没有Host属性,无法设置标头来做DNS重连
public virtual void Commit(WebProxy objName = null)
{
	string ret = string.Empty;
	string ip = string.Empty;
	try
	{
		HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.baidu.com");
		request.Method = "POST";//
		request.Timeout = 30000;
		request.ContentType = "application/x-www-form-urlencoded";
		request.ServicePoint.Expect100Continue = false;
		if(objName != null)
		{
			request.Proxy = objName;
		}
		byte[] byteArray = Encoding.UTF8.GetBytes("&a=要发送的数据&b=要发送的数据");
		request.ContentLength = byteArray.Length;
		Stream dataStream = request.GetRequestStream();
		dataStream.Write(byteArray,0,byteArray.Length);
		dataStream.Close();
		WebResponse response = request.GetResponse();
		dataStream = request.GetResponseStream();
		StreamReader reader = new StreamReader(dataStream);
		string responseFromServer = reader.ReadToEnd();
		reader.Close();
		dataStream.Close();
		response.Close();
	}
	catch(WebException ex)
	{
		Debug.Error("提交Apm日志失败:"+ex.Status.ToString());
		if(ex.Status.ToString().Equals("NameResolutionFailure"))//域名解释错误,重连一次,重新获取域名ip,用ip来拼接提交
		{
			ip = this.DnRetryGet("域名");
			if(ip.Equals("0"))
			{
				return
			}
			WebProxy proxy = new WebProxy(ip,80);
			this.Commit(proxy);
		}
	}
	
	if(ret.Equals("1"))
	{
		Debug.Log("提交Apm日志成功");
	}
	else
	{
		Debug.Log("提交Apm日志失败:"+ret);
	}
	
	public virtual string DnsRetryGet(string doMain)
	{
		
	}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值