2

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

ありがとうございました!

4

3 に答える 3

4
    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();
        }
    }
于 2012-09-14T09:55:19.143 に答える
1

Anton Sizikov の解決策は優れていますが、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();
        }
    }
}
于 2012-09-14T11:52:34.517 に答える
0

私にとっては、上記のより単純なバリエーションでも問題なく動作します

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

        if (e.Error == null)
        {
            url  = (string)e.UserState;
        }
       // ...
    }
于 2014-03-30T17:47:46.080 に答える