IISがカスタムエラーハンドラとして定義された従来のASPスクリプトを同期して単一のスレッドで実行することが判明しました。 これは非常に遅いです。私はIIS Expressの10.0によって提供index.asp
を持ってIISがカスタムエラーハンドラを単一スレッドで同期的に実行する
:
は、ここに私の設定です。 index.asp
には、3つのイメージ要素(<img src="..">
)があり、IISが各タグに対してカスタム400エラーハンドラーを呼び出すようにします。
3/10/2017 3:16:03 AM|start|http://localhost:8081/xENOjODFFUSZWDD
10-3-2017 3:16:12|end|http://localhost:8081/xENOjODFFUSZWDD
3/10/2017 3:16:12 AM|start|http://localhost:8081/pWEzIB25374ynkwv
10-3-2017 3:16:20|end|http://localhost:8081/pWEzIB25374ynkwv
3/10/2017 3:16:20 AM|start|http://localhost:8081/pMeODA30827gurud
10-3-2017 3:16:29|end|http://localhost:8081/pMeODA30827gurud
:ここ
Log2File "start"
call main
Log2File "end"
とは、3つの呼び出しのための時間があるよう
ハンドラがapplicationhost.config
<httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath" errorMode="Custom" >
<error statusCode="404" path="/handler.asp" responseMode="ExecuteURL" />
として
handler.asp
で定義されているが、その開始時刻と終了時刻を記録しますハンドラの実行はシーケンシャルであることがわかります。最初のst opsが3:16:12 に、2番目が3:16:12などに始まります。
TraceLogFiles
フォルダーに行って、存在しないファイルへの要求が来たときに、次々に来るのを見ましたか?
http://localhost:8081/pWEzIB25374ynkwv
<TimeCreated SystemTime="2017-03-10T01:16:03.586Z"/>
http://localhost:8081/pMeODA30827gurud
<TimeCreated SystemTime="2017-03-10T01:16:03.580Z"/>
http://localhost:8081/xENOjODFFUSZWDD
<TimeCreated SystemTime="2017-03-10T01:16:03.586Z"/>
私たちは、すべての要求がでほぼ同じ瞬間に来る見ることができます:
は、ここでの要求の時間です。
したがって、リクエストがキューに入れられ、次々と処理されるという結論になります。 3つの同時リクエストを処理するためのスレッドが3つ作成されていません。 そして、この1つのスレッドは、それらを順番に実行しました。
だから、私の質問は:
どのように私はIISがカスタムエラーハンドラの実行を並列化することができますか?
UPDATE
私は小さなテストをしました。私はindex.asp
に破損したSRCと5つのiframeを置く:ローカルホスト上
<%
Dim http, url
Set http = Server.CreateObject("MSXML2.ServerXMLHTTP")
url = "http://localhost:10000/"
http.open "GET", url, False
http.send()
Response.Write(http.ResponseText)
%>
:
<!DOCTYPE html>
<html>
<body>
<iframe style="border: 2px solid red" width="1080" height="100" src="http://localhost:8081/none1"></iframe>
<iframe style="border: 2px solid red" width="1080" height="100" src="http://localhost:8081/none2"></iframe>
<iframe style="border: 2px solid red" width="1080" height="100" src="http://localhost:8081/node3"></iframe>
<iframe style="border: 2px solid red" width="1080" height="100" src="http://localhost:8081/none4"></iframe>
<iframe style="border: 2px solid red" width="1080" height="100" src="http://localhost:8081/none5"></iframe>
</body>
</html>
は、その後、私は400エラーを処理するために、従来のASPを使用し
:10000 10secsの遅延と応答サーバを実行します:ここ
const logger = require('log4js').getLogger();
const uid = require('uid');
let app = require('express')()
app.get('/', (req,res)=>{
let id = uid();
logger.debug(`${id}: got request`);
setTimeout(function() {
logger.debug(`${id}: response sent`);
res.send(`${id}: All ok`);
}, 10000);
});
console.log('Listening on 1000');
app.listen(10000);
は、クロームのネットワークコンソールが表示するものです
ここでは、asp.netハンドラを使用します(Webから定義します)。設定):
Imports System.Web
Imports System.Net
Imports System.IO
Public Class MySyncHandler
Implements IHttpHandler
Private Function GetText() As String
Dim request As WebRequest = WebRequest.Create("http://localhost:10000/")
Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
Console.WriteLine(Now() & "|Got status: " & response.StatusDescription)
Dim dataStream As Stream = response.GetResponseStream()
Dim reader As New StreamReader(dataStream)
Dim responseFromServer As String = reader.ReadToEnd()
reader.Close()
dataStream.Close()
response.Close()
Return responseFromServer
End Function
Public Sub ProcessRequest(ByVal context As _
System.Web.HttpContext) Implements _
System.Web.IHttpHandler.ProcessRequest
Dim request As HttpRequest = context.Request
Dim response As HttpResponse = context.Response
Dim data As String = GetText()
response.Write("<!DOCTYPE html><html><head><meta charset='UTF-8'/></head>")
response.Write("<body>")
response.Write(data)
response.Write("</body>")
response.Write("</html>")
End Sub
Public ReadOnly Property IsReusable() As Boolean _
Implements System.Web.IHttpHandler.IsReusable
Get
Return False
End Get
End Property
End Class
とネットワークコンソールから絵はかなり良く見える:
ので、問題はクラシックASPハンドラです。
それを改善する方法はありますか?
エラーページの実行に9秒かかることは問題ではないと思いませんか?それをより速く(<100ms)し、同期実行について心配しないでください。私はあなたが実行モデルを変更できるかどうかは疑問です。 –
@PeterHahndorfエラーハンドラのジョブには時間がかかりますが、残念ながら9秒は上限ではありません。カスタムエラーハンドラとしてasync httpハンドラ(https://msdn.microsoft.com/en-us/library/ms227433.aspx)の実装が問題を解決できるかどうか疑問に思っていますか? – rlib