【问题标题】:Passing custom value with request to use in BeginGetResponse callback使用请求传递自定义值以在 BeginGetResponse 回调中使用
【发布时间】:2010-12-29 15:55:08
【问题描述】:

我有一种情况,我需要通过 Web 请求发送自定义值,以便在我的应用程序收到的响应中使用它。由于我的应用程序可能会发送多个请求,因此我使用 BeginGetResponse 异步发送每个请求。

目前我正在使用私有变量缓存该值,然后在回调方法中访问它。我知道这是自找麻烦,因为如果在我从上一个请求得到响应之前调用了相同的方法,那么数据可能已经更改。

我需要知道的是,在请求中传递数据以在响应中处理数据的最佳(标准)方式是什么?我最初的想法是自定义标题,但我不确定......

这是我现在的代码:

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
    }
}

【问题讨论】:

    标签: c# asynchronous httpwebrequest


    【解决方案1】:

    您需要创建一个包含requestid 的新对象。在以前的 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 中,您可以使用 Tuple<HttpWebRequest, int>

    【讨论】:

    • +1 简直不敢相信我从来没想过……我想我已经盯着这个太久了!
    • 我还能够创建一个自定义类,非常好的和聪明的解决方案。我没有想到,不知道为什么,它就像一个 lambda 表达式重载。
    猜你喜欢
    • 2015-10-13
    • 2013-05-05
    • 2021-10-19
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    相关资源
    最近更新 更多