2016-12-09 3 views
3

webclientクラスで奇妙な動作が検出されました。 UploadValues()同期メソッドを使用すると、通常は応答URIが得られますが、非同期バージョンUploadValuesTaskAsync()を同じURLに使用すると、レスポンスuriがnullとして返されます。どうして?Webクライアントが応答を取得しないuri

例:GetAsync方法で

using (var client = new CustomWebClient()) 
{ 
    await Get(client); 
    Get(client); 
} 

private async Task GetAsync(WebClient client) 
{ 
     var resAsync = await client.UploadValuesTaskAsync("http://address.com", requestData); 
     //client.ResponseUri null here 
} 

private void Get(WebClient client) 
{ 
    var res= client.UploadValues("http://address.com", requestData); 
    //client.ResponseUri **not** null here 
} 

client.ResponseUriがnull、およびUploadValuesにnullなくなります。

EDIT:

私は、Webクライアントは、 "カスタマイズ" で発見:

ので、クラスは次のとおりです。

public class CustomWebClient : WebClient 
{ 
    public CookieContainer Cookies { get; private set; } 
    public Uri ResponseUri { get; private set; } 

    public CustomWebClient() 
    { 
     Cookies = new CookieContainer(); 
    } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     var request = base.GetWebRequest(address) as HttpWebRequest; 
     if (request == null) 
     { 
      return base.GetWebRequest(address); 
     } 
     request.CookieContainer = Cookies; 
     return request; 
    } 

    protected override WebResponse GetWebResponse(WebRequest request) 
    { 
     var response = base.GetWebResponse(request); 
     ResponseUri = response.ResponseUri; 
     return response; 
    } 
} 

私はsynchronous方法で、それは前GetWebResponse方法を打つことを確認次の行に続く。しかしasynchronousバージョンでは、それは決してGetWebResponseに当たらない。

+0

を –

+1

そのない非同期ボイドを返すことをお勧めメソッド – gog

+0

正確にResponseUriを読んでいますか? – JuanR

答えて

1

カスタマイズされたクラスは、同期WebResponse GetWebResponse(WebRequest request)メソッドの動作のみをオーバーライドしています。

あなたは非同期バージョンのオーバーライドを追加する必要があります:あなたはちょうど2つの例の間で一致するように無効にするために、あなたのGetAsyncを変更することもできます

protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result) 
{ 
    var response = base.GetWebResponse(request, result); 
    ResponseUri = response.ResponseUri; 
    return response; 
} 
関連する問題