Laden...

WCF/REST Remove Http Header

Erstellt von Diräkt vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.957 Views
D
Diräkt Themenstarter:in
615 Beiträge seit 2009
vor 11 Jahren
WCF/REST Remove Http Header

Hallo Leute

Ich verwende WCF (webHttpBinding) für ein WebService. Es geht darum möglichst wenig traffic zu generieren, auch wenn ich den HTTP Standard dabei "verlasse".

Bisher bin ich durch das Hinzufügen eines Modules (ASP Host), soweit gekommen, das meine Response so aussieht:

HTTP/1.1 200 OK
Date: Mon, 23 Apr 2012 03:06:42 GMT
Connection: close
Content-Length: 0

Ziel:

HTTP/1.1 200 OK
Content-Length: 0

Gibt es irgendwie eine Möglichkeit (auch wenn es ein "hack ist"), mein Ziel zu erreichen? Oder zumindest ein Teil-Ziel 😉 ?

Beste Grüsse und vielen Dank

Diräkt

6.911 Beiträge seit 2009
vor 11 Jahren

Hallo Diräkt,

über WebOperationContext.Current.OutgoingRequest.Headers sollten die Header manipulierbar sein. Ev. ist darauf zu achten, dass im IIS kein IHttpModul den/die Header-Einträge wieder setzt, somit ggf. stattdessen selbst ein IHttpModul erstellen das die Header bearbeitet.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

D
Diräkt Themenstarter:in
615 Beiträge seit 2009
vor 11 Jahren

Hallo gfoidl

Herzlichen Dank für Deine Antwort.

Ich glaube weil Content-Type sowie Date und **Content-Length ** zum HTTP Protokoll Standard gehören, man diese nicht entfernen kann.

Ich habe ein HTTP Modul geschrieben mit folgendem Inhalt :


public class CloakHttpHeaderModule : IHttpModule
    {

        private readonly List<string> headersToCloak;

        public CloakHttpHeaderModule()
        {
            headersToCloak = new List<string>
                                      {
                                              "Server",
                                              "X-AspNet-Version",
                                              "X-AspNetMvc-Version",
                                              "X-Powered-By",
                                              "Date",
                                              "Content-Length",
                                              "Content-Type"
                                      };
        }

        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += context_PreSendRequestHeaders;
        }

        void context_PreSendRequestHeaders(object sender, EventArgs e)
        {
            headersToCloak.ForEach(h => HttpContext.Current.Response.Headers.Remove(h));
            if (WebOperationContext.Current != null)
                headersToCloak.ForEach(h => WebOperationContext.Current.OutgoingRequest.Headers.Remove(h));

        }

        public void Dispose()
        {

        }
    }

Leider sieht meine Antwort noch immer so aus: (was, wie ich befürchte, das Minimum ist)

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Mon, 03 Sep 2012 07:29:52 GMT
Content-Length: 89

"ECF949B9CF2B8B8B8E1AEA2A6AAA8A0E1ACA0A2E99B82F2E08BAAB9A6ACAA83A0A8A6A1E99B9FF2F7FF92{}"

Beste Grüsse

Diräkt

6.911 Beiträge seit 2009
vor 11 Jahren

Hallo Diräkt,

ich vermute auch, dass das der minimale HttpHeader ist den der IIS schickt.

Als Möglichkeit fällt mir noch ein, die Response über einen Proxy zu schicken und dort den/die Header zu manipulieren. Ob sich aber der Aufwand für die Erstellung des Proxys lohnt bezweifle ich.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

16.830 Beiträge seit 2008
vor 11 Jahren

Über den IIS funktioniert das Entfernen von nicht-optionalen Headern überhaupt nicht; er schickt es immer mit, wie gfoidl schon gesagt hat - und das ist gut so.
Der IIS liefert im Prinzip HTTP Antworten aus - willst Du davon eine Abweichung musst Du Dir einen anderen weg ohne IIS suchen - zum Beispiel einen eigenen Server schreiben.

Dann würde ich an Deiner Stelle aber gleich ein "eigenes" Protokoll schreiben, und nicht veruschen HTTP zu missbrauchen.

Connection- und Datumsinformationen sind für HTTP Requests unabdingbar.
Verlässt Du den HTTP Standard gewollt dann können unabhängige Clients damit auch mit sehr hoher Wahrscheinlichkeit nicht mehr korrekt zugreifen oder hast ungewollte Nebeneffekte. Dann widerum kannst Du WCF gleich weglassen.

656 Beiträge seit 2008
vor 11 Jahren

Bin mir nicht sicher, ob/wie der IIS das handhabt, aber eventuell könnte er auf HTTP/1.0 zurückgehen - dort sind die alle Optional (wenn ich die RFC 1945 da jetzt richtig in Erinnerung habe).