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
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!"
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
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!"
Ü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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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).