Как настроить HTTPPlatformHandler для IIS для отправленного сервером события (SSE, EventStream)
В настоящее время у меня есть программа, которая предоставляет SSE в качестве службы, и я должен развернуть ее на IIS. Но это не работает правильно, вот результат, когда я запускаю.exe без IIS.
data: Hello, world
Но когда он запускался за IIS, браузер зависал при загрузке. Я должен очистить событие Hello, world
тысячу раз, чтобы IIS сбрасывал результат в браузер, и он мгновенно сбрасывался вместо постепенного обновления, как в случае использования SSE.
Вот мой web.config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="httpplatformhandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
</handlers>
<httpPlatform processPath=".\sse_server.exe"
arguments="-port=%HTTP_PLATFORM_PORT% -environment development"
stdoutLogEnabled="false"
requestTimeout="00:05:00"
stdoutLogFile=".\sse_server_log">
</httpPlatform>
<urlCompression doStaticCompression="true" doDynamicCompression="false" />
<caching enabled="false" enableKernelCache="false" />
</system.webServer>
</configuration>
Вот мой go
код
func SSEHello(rw http.ResponseWriter, flusher http.Flusher) {
rw.Header().Set("Content-Type", "text/event-stream; charset=utf-8")
rw.Header().Set("Cache-Control", "no-cache")
rw.Header().Set("Connection", "keep-alive")
rw.WriteHeader(http.StatusOK)
for i := 0; i < 1000; i++ {
rw.Write([]byte("data:Hello, world\n\n"))
flusher.Flush()
time.Sleep(time.Millisecond * 100)
}
}
1 ответ
На самом деле HttpPlatformHandler имеет 8 Кбайт выходного буфера, поэтому мое сообщение не отправляется немедленно.
Я должен изменить HttpPlatformHandler на основной модуль ASP.NET, поэтому web.config
должен обновить к этому.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath=".\sse_server.exe" />
</system.webServer>
</configuration>
И начать go
приложение как aspNetCore
на iis
, приложение должно получить имя переменной среды ASPNETCORE_PORT
затем запустите службу http на этом порту.
port := os.Getenv("ASPNETCORE_PORT")
http.ListenAndServe(":"+port, nil)
Это все!