【问题标题】:How can I get the URL in OpenReadCompletedEvent when I use webclient使用 webclient 时如何在 OpenReadCompletedEvent 中获取 URL
【发布时间】:2012-09-14 08:39:06
【问题描述】:

使用 webclient 时如何获取 OpenReadCompletedEvent 中的 URL。

 WebClient webClient = new WebClient();
 webClient.OpenReadAsync(url);       // in event method I want get this url       
 webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(CardInfoDown_Completed);   


 private void CardInfoDown_Completed(object sender, OpenReadCompletedEventArgs e)
    {
        if (e.Error == null)
        {           
            using (System.IO.StreamReader reader = new System.IO.StreamReader(e.Result))
            {
                // I want get the url here,
                // How to do this?
                string strStream = reader.ReadToEnd();              
            }
        }          
    }

谢谢!

【问题讨论】:

  • 为什么不将 url 保持为全局?并在活动中访问它?

标签: c# .net windows-phone-7 webclient


【解决方案1】:
    WebClient webClient = new WebClient();
    webClient.BaseAddress = "http://hhh.com";
    webClient.OpenReadAsync(new Uri("http://hhh.com"));       // in event method I want get this url       
    webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(CardInfoDown_Completed);

还有:

private void CardInfoDown_Completed(object sender, OpenReadCompletedEventArgs e)
{
    if (e.Error == null)
    {
        using (System.IO.StreamReader reader = new System.IO.StreamReader(e.Result))
        {
            // I want get the url here,
            // How to do this?
            var client = sender as WebClient;
            if (client != null)
            {
                var url = client.BaseAddress; //returns hhh.com
            }
            string strStream = reader.ReadToEnd();
        }
    }

【讨论】:

  • 我在完成的事件中得到基地址为空。你能猜到为什么吗??
【解决方案2】:

Anton Sizikov 的解决方案很好,但只有在 URL 是绝对 URL 时才有效(例如 http://hhh.com)。如果使用相对 URL,.NET 会自动将基地址与相对 URL 合并(因此可能会导致 URL 无效)。

要将值发送到 OpenReadCompleted 事件处理程序,您应该使用此 OpenRead 重载来提供自定义令牌(在本例中为您的 URL):http://msdn.microsoft.com/en-us/library/ms144212(v=vs.95).aspx

WebClient webClient = new WebClient();
webClient.OpenReadAsync(new Uri("http://hhh.com"), "http://hhh.com");
webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(CardInfoDown_Completed);

然后去取值:

private void CardInfoDown_Completed(object sender, OpenReadCompletedEventArgs e)
{
    if (e.Error == null)
    {
        using (System.IO.StreamReader reader = new System.IO.StreamReader(e.Result))
        {
            var url = (string)e.UserState;
            string strStream = reader.ReadToEnd();
        }
    }
}

【讨论】:

  • 是的,我忘记了 UserState,谢谢!
【解决方案3】:

对我来说,上面的更简单的变化也可以正常工作

    private void CardInfoDown_Completed(object sender, DownloadStringCompletedEventArgs e)
    {
        string url;

        if (e.Error == null)
        {
            url  = (string)e.UserState;
        }
       // ...
    }

【讨论】:

  • 好吧,我使用了 DownloadStringCompletedEventArgs,但实际上它可能与前面的示例具有相同的成分..
猜你喜欢
  • 2017-06-09
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多