{"id":7064,"date":"2020-12-31T13:11:44","date_gmt":"2020-12-31T11:11:44","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=7064"},"modified":"2021-01-23T00:14:11","modified_gmt":"2021-01-22T22:14:11","slug":"asp-net-core-signalr-hinter-nginx-fix-fuer-requests-with-connection-upgrade-cannot-have-content-in-the-request-body","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/asp-net-core-signalr-hinter-nginx-fix-fuer-requests-with-connection-upgrade-cannot-have-content-in-the-request-body\/","title":{"rendered":"ASP.NET Core SignalR hinter Nginx: Fix f\u00fcr &#8222;Requests with Connection: Upgrade cannot have content in the request body&#8220;"},"content":{"rendered":"<p>ASP.NET Core bringt mit Kestrel einen minimalistischen Webserver mit. Dieser setzt den Fokus darauf, dynamische mit ASP.NET Core generierte Seiten m\u00f6glichst effizient auszuliefern. Ganz anders sah es mit dem alten ASP.NET aus: Hier musste der sehr umf\u00e4ngliche IIS eingesetzt werden. Dies hatte Vor- und Nachteile. Der IIS war zwar recht komplex, konnte daf\u00fcr aber mit einem vollumf\u00e4nglichen Webserver wie dem Apache2 mithalten. Ein zweiter Webserver als Reverse Proxy war hier daher oft nicht notwendig.<\/p>\n<p>Anders sieht es mit Kestrel aus. Da dieser im Design eines Microservices recht schlank gehalten ist, fehlen ihm selbst viele Funktionen, die andere leichtgewichtige und auf Leistung optimierte Webserver wie Nginx mitbringen. Dies ist nicht zwingend schlecht. Kestrel ist f\u00fcr einfache Anwendungen ausreichend und bringt keinen unn\u00f6tigen Ballast mit. Wer mehr ben\u00f6tigt, kann einen Nginx oder auch Apache-Webserver davor schalten. Somit hat man ein modulares Design, das auf unn\u00f6tigen Ballast verzichtet. <\/p>\n<p>F\u00fcr viele Anwendungsf\u00e4lle d\u00fcrfte die Kombination von Kestrel mit Nginx ein guter Kompromiss sein zwischen mehr Funktionen, aber zeitgleich weniger Overhead als ein threadbasierter Apache-Webserver. Im Falle von Nginx ist mir bei der Verwendung von Websockets mit der SignalR-Bibliothek ein Problem aufgefallen.<\/p>\n<h2 class=\"wp-block-heading\">Der &#8222;Connection&#8220;-Header<\/h2>\n<p>Mein anf\u00e4ngliches Setup war ein gro\u00dfteils vanilla konfigurierter Nginx-Webserver. Dieser sollte alle Anfragen an den Kestrel-Webserver einer ASP.NET Core Webanwendung weiterleiten, ausgenommen ein bestimmtes Verzeichnis. Um Tipparbeit zu sparen kopierte ich mir hierf\u00fcr ein Snippet kopiert und angepasst:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-nginx\" data-line=\"\">server {\n    listen       80;\n    server_name  _;\n\n    location \/ {\n        proxy_pass http:\/\/127.0.0.1:3000;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        \n        proxy_set_header Connection &quot;upgrade&quot;;\n    }\n\n    location \/forum {\n        proxy_pass http:\/\/127.0.0.1:81;\n    }\n}<\/code><\/pre>\n<p>Abgesehen von SignalR funktionierte dies auch. Bei den daf\u00fcr notwendigen Websocket-Verbindungen wurde folgender Fehler geworden:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nConnection id &quot;XXX&quot; bad request data: &quot;Requests with &#039;Connection: Upgrade&#039; cannot have content in the request body.&quot;\n<\/pre>\n<\/div>\n<p>Das Problem liegt im Connection-Header, der hart auf <strong>upgrade<\/strong> gesetzt wurde. Stattdessen muss er auf $http_connection gesetzt werden. Dies entspricht dem mitgelieferten Wert aus der Anfrage. Somit muss der Location-Block wie folgt lauten:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-nginx\" data-line=\"\">location \/ {\n    proxy_pass http:\/\/127.0.0.1:3000;\n    proxy_http_version 1.1;\n    proxy_set_header Upgrade $http_upgrade;\n    \n    # https:\/\/stackoverflow.com\/questions\/46556780\/asp-net-core-2-0-unable-to-post-to-database\n    proxy_set_header Connection $http_connection;\n}<\/code><\/pre>\n<p class=\"has-text-align-center\"><em>Icon von Freepik\/www.flaticon.com<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>ASP.NET Core bringt mit Kestrel einen minimalistischen Webserver mit. Dieser setzt den Fokus darauf, dynamische mit ASP.NET Core generierte Seiten m\u00f6glichst effizient auszuliefern. Ganz anders sah es mit dem alten ASP.NET aus: Hier musste der sehr umf\u00e4ngliche IIS eingesetzt werden. Dies hatte Vor- und Nachteile. Der IIS war zwar recht komplex, konnte daf\u00fcr aber mit &#8230;<\/p>\n","protected":false},"author":5,"featured_media":7077,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[61],"tags":[727,541,847,848,849],"class_list":["post-7064","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-softwareentwicklung","tag-asp-net-core-2","tag-nginx","tag-reverse-proxy","tag-signalr","tag-websocket"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7064","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=7064"}],"version-history":[{"count":2,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7064\/revisions"}],"predecessor-version":[{"id":7079,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7064\/revisions\/7079"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/7077"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=7064"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=7064"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=7064"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}