C# 使用webclient时,如何在OpenReadCompletedEvent中获取URL

C# 使用webclient时,如何在OpenReadCompletedEvent中获取URL,c#,.net,windows-phone-7,webclient,C#,.net,Windows Phone 7,Webclient,当我使用webclient时,如何在OpenReadCompletedEvent中获取URL WebClient webClient = new WebClient(); webClient.OpenReadAsync(url); // in event method I want get this url webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(CardInfoDown_C

当我使用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();              
            }
        }          
    }
谢谢大家!

    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);
以及:


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

要将值发送到
OpenReadCompleted
事件处理程序,您应该使用此
OpenRead
重载来提供自定义令牌(在本例中为您的URL):

然后检索该值:

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();
        }
    }
}

对我来说,即使是一个简单的变化,从上述工程罚款

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

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

为什么不将url保持为全局?并在活动中访问它?是的,我忘记了UserState,谢谢!在已完成的事件中,我将baseaddress设置为null。。你能猜出原因吗?嗯,我使用了DownloadStringCompletedEventArgs,但实际上它的成分可能与前面的示例相同。。
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();
        }
    }
}
    private void CardInfoDown_Completed(object sender, DownloadStringCompletedEventArgs e)
    {
        string url;

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