2011-10-27 7 views
2

C#で単純なhttpクライアントを作成する必要があります。非同期でなければならず、サーバーへの永続的な接続をサポートする必要があります。だから私はWebClientクラスを使用しようとしているが、私はいくつかの問題を抱えている、私のコードはこれです:C#async永続WebClientの例

void sendMessage() 
{ 
    ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(bypassAllCertificateStuff); 

    string loginRequest = @"{'IDENTIFIER':'patient1','PASSWORD':'asdasd','DEVICE_ID':'knt-01'}"; 

    client = new WebClient();   

    // add event handlers for completed and progress changed 
    client.UploadProgressChanged += new UploadProgressChangedEventHandler(client_UploadProgressChanged); 
    client.UploadStringCompleted += new UploadStringCompletedEventHandler(client_UploadStringCompleted); 
    client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); 

    // carry out the operation as normal 

    client.UploadStringAsync(new Uri("Https://192.168.1.100/PaLogin"), "POST", loginRequest); 
} 

void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
{ 
    Console.WriteLine("downloadProgressChanged"); 
} 

void client_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e) 
{ 
    // Console.WriteLine(e.ProgressPercentage); 
    if (e.ProgressPercentage != 50) 
    { 
     Console.WriteLine("uploadProgressChanged"); 
    } 
} 

void client_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e) 
{ 
    if (e.Result != null) 
    { 
     Console.WriteLine("Done"); 
    } 
} 

問題は、私は、サーバーからの応答を受信する必要があることですが、どちらもclient_UploadStringCompletedもclient_DownloadProgressChangedコールバックが呼び出されます。私は、コンソールに表示 唯一のものは次のとおりですので、基本的に私は何をしようとしている

をclient_DownloadProgressChangedです:私は受信

1 - 私は、接続 2-閉じずに、サーバーにいくつかのデータを送信しますサーバーの応答が表示されますが、接続がまだ開いている必要があります。

私には何が欠けていますか?

ありがとうございます。 :-)

答えて

1

ここではHTTPプロトコル全体がありません。

HTTPはステートレス要求応答プロトコルです。 HTTP 1.1では、のオプションのを提供しています。要求応答のパラダイムについては、変更はありません。 [クライアントまたはサーバーがそれを尊重しないようにして接続を閉じた多くのケースを見てきました。]ストリーミングを容易にするためにチャンクエンコードを提供していますが、それはHTTPに関する限りです。

基本的にHTTPでは、クライアントは応答またはタイムアウトを受信するまで応答を待機し(接続を開いたままにします)。この動作を変更/改善する方法はありません。

今、あなたに問題があります。 私は何かがサーバーに接続すると間違っていると思うので、何が起こっているか見るためにFiddlerを使用する必要があります。私の勘違いは、証明書のチェックが呼ばれていないので、サーバー(ファイアウォール、サーバーダウンなど)に接続しないということです。

+0

http://en.wikipedia.org/wiki/Comet_(programming)

C#クライアントをHTTPトランザクションが完了した後に接続が開いたままであり、クライアントは新しい接続を作成する代わりに、この既存の接続を使用して別のHTTP要求を送信する可能性があります。 – Polynomial

+0

真。しかし、私は、クライアントまたはサーバーがそれを尊重しないことを決定し、接続を閉じた多くのケースを見てきました。 – Aliostad

+0

'接続:キープアライブ'は**キープアライブを要求する**ように設計されています。サポートに頼ることはできません。サーバがそれをサポートしていない場合、またはサーバを提供したくない場合、単に接続を終了します。後でクライアントが接続を必要としないと判断した場合、クライアントは接続を終了します。同じことがサーバー側にも当てはまります。 – Polynomial

0

HTTPサーバープッシュメカニズムでこれを行うことができます。 この参照:キープAlive`をTCPの原因になります: `接続、これを拡張する

using (var client = new WebClient()) 
using (var reader = new StreamReader(client.OpenRead(uri), Encoding.UTF8, true)) 
{ 
    string line; 
    while ((line = reader.ReadLine()) != null) 
    { 
     Console.WriteLine(line); 
    } 
} 

(CHEèquelloチェVI dicevo questo pomeriggio)

関連する問題