C# HttpWebRequest 异步请求

本文介绍了一个异步请求的实现方式,并详细展示了如何使用HttpWebRequest进行POST请求,包括设置请求头、发送数据及异常处理等关键步骤。

同事古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)
	{
		
	}


<think>我们参考引用[1]和引用[2]中关于HTTP请求的代码示例,特别是如何添加请求头(Authorization)的部分。根据用户需求,我们需要在GET请求中添加BearerToken认证。引用[1]中提供了GET请求的基本结构,并展示了如何添加Authorization请求头。引用[2]中展示了POST请求如何添加参数和请求头,但我们可以借鉴添加请求头的方法。步骤:1.创建HttpWebRequest对象,指定URL。2.设置请求方法为GET。3.在请求头中添加Authorization,值为"Bearer<token>"。4.获取响应并读取内容。注意:BearerToken的格式是:Bearer后面跟一个空格,然后是token字符串。示例代码:```stringurl="https://example.com/api/data";//替换为实际URLstringtoken="your_token_here";//替换为实际tokenHttpWebRequestrequest=(HttpWebRequest)WebRequest.Create(url);request.Method="GET";request.Headers.Add("Authorization","Bearer"+token);//添加BearerToken//设置超时等属性(可选)request.Timeout=20000;//20秒超时try{using(HttpWebResponseresponse=(HttpWebResponse)request.GetResponse()){//检查响应状态if(response.StatusCode==HttpStatusCode.OK){using(StreamresponseStream=response.GetResponseStream())using(StreamReaderreader=newStreamReader(responseStream,Encoding.UTF8)){stringresponseText=reader.ReadToEnd();Console.WriteLine(responseText);//处理响应内容,例如解析JSON等}}else{Console.WriteLine($"请求失败,状态码:{response.StatusCode}");}}}catch(WebExceptionex){//处理异常,例如超时或网络错误Console.WriteLine($"请求发生异常:{ex.Message}");if(ex.Response!=null){using(varerrorResponse=(HttpWebResponse)ex.Response){using(StreamerrorStream=errorResponse.GetResponseStream())using(StreamReadererrorReader=newStreamReader(errorStream)){stringerrorText=errorReader.ReadToEnd();Console.WriteLine($"错误响应内容:{errorText}");}}}}```注意:在实际使用中,请将url和token替换为实际值。另外,引用[2]中提到了POST请求的示例,但这里我们只需要GET请求。如果token是通过其他方式获取的(例如OAuth2.0授权),请确保在请求前已经获取到有效的token。相关问题:1.如何处理BearerToken过期的情况?2.在C#中,除了HttpWebRequest,还有哪些方式可以发送HTTP请求(如HttpClient)?3.如何为HttpWebRequest设置代理?4.如何异步发送HttpWebRequest请求?5.如何添加多个请求头?6.如何处理HTTPS请求的证书问题?</think>### C# HttpWebRequest GET 请求添加 Bearer Token 示例 在 C# 中使用 `HttpWebRequest` 添加 Bearer Token 认证的完整步骤如下: ```csharp using System; using System.IO; using System.Net; using System.Text; public class HttpRequestHelper { public static string GetWithBearerToken(string url, string token) { try { // 创建请求对象 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.ContentType = "application/json"; request.Timeout = 30000; // 30秒超时 // 添加 Bearer Token 认证头 request.Headers.Add("Authorization", $"Bearer {token}"); // 获取响应 using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using (Stream responseStream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8)) { return reader.ReadToEnd(); } } catch (WebException ex) { // 处理错误响应 if (ex.Response is HttpWebResponse errorResponse) { using (Stream errorStream = errorResponse.GetResponseStream()) using (StreamReader errorReader = new StreamReader(errorStream)) { string errorContent = errorReader.ReadToEnd(); throw new Exception($"HTTP Error {(int)errorResponse.StatusCode}: {errorContent}"); } } throw; } } } // 使用示例 string apiUrl = "https://api.example.com/data"; string accessToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."; try { string result = HttpRequestHelper.GetWithBearerToken(apiUrl, accessToken); Console.WriteLine("API响应: " + result); } catch (Exception ex) { Console.WriteLine("请求失败: " + ex.Message); } ``` #### 关键说明: 1. **认证头设置**:通过 `request.Headers.Add("Authorization", $"Bearer {token}")` 添加 Bearer Token 2. **错误处理**:捕获 `WebException` 并解析错误响应内容 3. **资源释放**:使用 `using` 语句确保响应流正确关闭 4. **超时设置**:`Timeout` 属性控制请求等待时间(毫秒) > 注意:Bearer Token 通常由 OAuth2.0 认证流程获取,格式为 `Bearer <token>`,其中 token 是 JWT 或其他类型的访问令牌[^1]。 #### 常见问题排查: 1. **401 未授权错误**: - 检查 token 是否过期 - 验证 token 格式是否正确(需包含 `Bearer` 前缀) - 确认 API 所需的权限范围 2. **性能优化**: - 复用 `HttpWebRequest` 对象(注意线程安全) - 异步处理使用 `BeginGetResponse/EndGetResponse` - 添加压缩支持:`request.AutomaticDecompression = DecompressionMethods.GZip` 3. **安全建议**: - 使用 HTTPS 加密传输 - 避免在代码中硬编码 token(使用安全存储) - 定期轮换访问令牌
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值