C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Response.close について


(過去ログ 116 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■68526 / inTopicNo.1)  Response.close について
  
□投稿者/ kos (1回)-(2013/10/25(Fri) 15:07:51)

分類:[.NET 全般] 

2013/10/28(Mon) 15:50:33 編集(投稿者)
2013/10/28(Mon) 15:09:04 編集(投稿者)
2013/10/28(Mon) 15:00:33 編集(投稿者)

【開発環境】VisualStudio 2005 
【開発言語】VB.NET, ASP.NET(VB)
【開発OS】Windows 7

現在、Windows2003とWindows2008r2で、上記環境で作成したプログラムを動作させているのですが
Response.Closeの挙動が異なっており困っております。

クライアントでデバッグ実行を行うと、send()の部分で以下の様な違いがあります。
・Windows2003に送信すると、Response.Close が実行されたタイミングで次の行に進む
・Windows2008r2に送信すると、10秒間のスリープの後に次の行に進む

なぜこのような動作になるのか、もし心当たりのある方がいらっしゃいましたらご教示いただけますか?


※クライアント側のソース(exe)
Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click

    Dim xmlhttp As New MSXML2.XMLHTTP
    Dim resbody As Byte()
    Dim resdata As String

    xmlhttp.open("POST", "http://(サーバのアドレス)/testsite/sleep.aspx", False)
    xmlhttp.send()
    resbody = xmlhttp.responseBody
    resdata = System.Text.Encoding.GetEncoding("Shift-JIS").GetString(resbody)

End Sub

※サーバ側のソース(sleep.aspx)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Response.Write("A")
    Response.Flush()
    Response.Close()

    System.Threading.Thread.Sleep(10000)

    Response.End()
End Sub

引用返信 編集キー/
■68527 / inTopicNo.2)  Re[1]: Response.close について
□投稿者/ WebSurfer (79回)-(2013/10/25(Fri) 16:38:28)
No68526 (kos さん) に返信
> ※サーバ側のソース(sleep.aspx)
> Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
>
> Response.Write("A")
> Response.Flush()
> Response.Close()
>
> System.Threading.Thread.Sleep(10000)
>
> Response.End()
> End Sub
>

直接の回答ではありませんが・・・

これが問題の原因ではないかもしれませんが、そもそも Response.Flush の後、
Response.Close するのは間違いだと思います。

話は、そこのところを直してからにした方がよさそうです。

Response.Flush メソッドを使うと chunked コーディングになります。

Response.Close は "クライアントへのソケット接続を閉じます" ということなの
で、提示されているコードでは chunked コーディングでデータの終了を示す 0 が
送信されないまま終了してしまうはずです。(Fiddler 等で見てください)

また、Response.End の使用も推奨されていません。理由は、End メソッドでスロ
ーされる ThreadAbortException がパフォーマンスに悪影響を及ぼすからだそう
です。MSDN ライブラリを読んでください。

Response.Close、Response.End は両方必要なく、HTTP パイプラインの最後まで
普通に完了させれば済むのではないですか。

引用返信 編集キー/
■68530 / inTopicNo.3)  Re[2]: Response.close について
□投稿者/ PANG2 (18回)-(2013/10/25(Fri) 17:37:15)
そもそも論で言うと、Webフォーム(aspx)ではなくジェネリックハンドラ(ashx)で作成するのよいでは?
引用返信 編集キー/
■68567 / inTopicNo.4)  Re[2]: Response.close について
□投稿者/ kos (2回)-(2013/10/28(Mon) 16:16:17)
No68527 (WebSurfer さん) に返信
回答ありがとうございます。

> Response.Close は "クライアントへのソケット接続を閉じます" ということなの
> で、提示されているコードでは chunked コーディングでデータの終了を示す 0 が
> 送信されないまま終了してしまうはずです。(Fiddler 等で見てください)

別サイトですが、検索していたら以下の書き込みがありました。私がやりたかったことは、まさにこれでした。
どうやら処理の流れを見直す必要がありそうですね。
http://social.msdn.microsoft.com/Forums/ja-JP/067d7e39-c922-4529-b5a1-ebc32a22409b/responseclosechunked?forum=aspnetja

また、ソースについての助言、ありがとうございます。これを機に修正してみようと思います。


No68530 (PANG2 さん) に返信
回答ありがとうございます。

> そもそも論で言うと、Webフォーム(aspx)ではなくジェネリックハンドラ(ashx)で作成するのよいでは?
お恥ずかしい限りですが、ashxの存在を知りませんでした。情報ありがとうございます。
修正しようとしているのは昔から使用しているシステムで、URLを変更するのは他への影響が少しありそうなので
次に機能を追加する機会がありましたら、こちらを使用してみようと思います。


この件については別の方法で対応するようにします。
どうもありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -