Как настроить HTTPPlatformHandler IIS для отправленного сервером события (SSE, EventStream) - PullRequest
0 голосов
/ 26 сентября 2018

В настоящее время у меня есть программа, предоставляющая 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 Ответ

0 голосов
/ 28 сентября 2018

На самом деле HttpPlatformHandler имеет 8kb выходного буфера , поэтому мое сообщение не отправляется немедленно.

Мне нужно изменить 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)

Вот и все!

...