C# 通过请求传递自定义值以在BeginGetResponse回调中使用
在这种情况下,我需要将自定义值与web请求一起发送,以便在应用程序收到的响应中使用它。由于我的应用程序可能会发送多个请求,所以我使用异步发送每个请求 目前,我正在使用私有变量缓存该值,然后在回调方法中访问它。我知道这会带来麻烦,因为如果在我从上一个请求得到响应之前调用了相同的方法,那么数据可能已经更改了 我需要知道的是,在请求中传递数据以在响应中处理数据的最佳(标准)方式是什么?我最初的想法是自定义标题,但我不确定 这是我目前的代码:C# 通过请求传递自定义值以在BeginGetResponse回调中使用,c#,asynchronous,httpwebrequest,C#,Asynchronous,Httpwebrequest,在这种情况下,我需要将自定义值与web请求一起发送,以便在应用程序收到的响应中使用它。由于我的应用程序可能会发送多个请求,所以我使用异步发送每个请求 目前,我正在使用私有变量缓存该值,然后在回调方法中访问它。我知道这会带来麻烦,因为如果在我从上一个请求得到响应之前调用了相同的方法,那么数据可能已经更改了 我需要知道的是,在请求中传递数据以在响应中处理数据的最佳(标准)方式是什么?我最初的想法是自定义标题,但我不确定 这是我目前的代码: public void SendRequestAsnyc(s
public void SendRequestAsnyc(string param1, string param2, string uri, int id)
{
NameValueCollection @params = System.Web.HttpUtility.ParseQueryString(String.Empty);
@params.Add("param1", param1);
@params.Add("param2", param2);
byte[] data = UTF8Encoding.UTF8.GetBytes(@params.ToString());
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = WebRequestMethods.Http.Post;
request.ContentLength = data.Length;
request.ContentType = "application/x-www-form-urlencoded";
var stream = request.GetRequestStream();
stream.Write(data, 0, data.Length);
// take a note of data to be processed in the callback
_cachedId = id;
IAsyncResult ar = request.BeginGetResponse(new AsyncCallback(GetAsyncResponse), request);
}
private void GetAsyncResponse(IAsyncResult result)
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
if (request.HaveResponse)
{
var response = (HttpWebResponse)request.EndGetResponse(result);
var reader = new System.IO.StreamReader(response.GetResponseStream());
var data = reader.ReadToEnd();
// process data
// use _cachedId here to update database with response
}
}
您需要创建一个包含
请求
和id
的新对象。在以前版本的C#中,可以使用对象数组或匿名对象来实现这一点。以下是如何使用对象数组执行此操作:
IAsyncResult ar = request.BeginGetResponse(GetAsyncResponse, new object[] {request, id});
private void GetAsyncResponse(IAsyncResult result)
{
object[] params = (object[])result.AsyncState;
HttpWebRequest request = (HttpWebRequest)params[0];
int id = (int)params[1];
// process here
}
使用C#4.0,您可以使用
元组您需要创建一个包含请求
和id的新对象。在以前版本的C#中,可以使用对象数组或匿名对象来实现这一点。以下是如何使用对象数组执行此操作:
IAsyncResult ar = request.BeginGetResponse(GetAsyncResponse, new object[] {request, id});
private void GetAsyncResponse(IAsyncResult result)
{
object[] params = (object[])result.AsyncState;
HttpWebRequest request = (HttpWebRequest)params[0];
int id = (int)params[1];
// process here
}
有了C#4.0,你可以使用一个元组+1真不敢相信我从来没有想过……我想我已经盯着这个太久了!我还能够创建一个自定义类,这是一个非常好和聪明的解决方案。我不会想到这一点,也不知道为什么,这就像一个lambda表达式过载。+1真不敢相信我从来没有想到过这一点……我想我已经盯着这个太久了!我还能够创建一个自定义类,这是一个非常好和聪明的解决方案。我不会想到这一点,也不知道为什么,这就像一个lambda表达式过载。