Frage

Ich habe einen WCF-Dienst in IIS / ASP.NET gehostet, HTTP Post akzeptiert ( post nicht bilden ) von serialisierten Objekten.

Wenn der Client sendet ungültige Anforderungen (zB sie das Objekt nicht richtig Serialisierung) Ich mag die Nachricht anmelden geschickt.

Wir sind bereits ELMAH mit Ausnahmen erfassen nicht behandelte, so einfach die Post-Daten Befestigung wäre die einfachste Option sein.

Ich kann den Strom bekommt Httpcontext während einer Ausnahme, aber dies nur die HTTP-Header-Informationen nicht enthält.

Meine Frage ist: Gibt es eine Möglichkeit, die ursprüngliche HTTP-POST-Anfrage Körper einzufangen? Oder andernfalls - eine bessere Art und Weise (ohne Reverse-Proxy) den Eingang erfaßt, die den Fehler verursacht hat?

Edit: Nur um zu klären, zu allen Zeiten auf Paketebene Erfassung läuft, ist nicht wirklich geeignet. Ich bin nach einer Lösung, die ich auf Produktionsservern bereitstellen kann und die Kunden werden außerhalb unserer Kontrolle oder Fähigkeit hat, zu überwachen.

Bearbeiten # 2: Ein Vorschlag gemacht wurde, die Request.InputStream zuzugreifen - das funktioniert nicht, wenn Sie zu lesen sind versuchen, nach WCF die Anforderung aus dem Stream gelesen hat.

Eine Probe Stück Code, um zu sehen, wie ich habe versucht, mit dieser hier.

        StringBuilder log = new StringBuilder();

        var request = HttpContext.Current.Request;

        if (request.InputStream != null)
        {
            log.AppendLine(string.Format("request.InputStream.Position = \"{0}\"", request.InputStream.Position));
            if (request.InputStream.Position != 0)
            {
                request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
            }

            using (StreamReader sr = new StreamReader(request.InputStream))
            {
                log.AppendLine(string.Format("Original Input: \"{0}\"", sr.ReadToEnd()));
            }
        }
        else
        {
            log.AppendLine("request.Inputstream = null");
        }


        log.ToString();

Der Ausgang von log.ToString () ist:

    request.InputStream.Position = "0"
    Original Input: ""
War es hilfreich?

Lösung

Durch die Zeit, es zu Ihrem Service bekommt die Anforderung verarbeitet wird und nicht für Sie.

Allerdings ... Sie könnten eine Nachricht Inspektor . Nachricht Inspektoren können Sie mit der Meldung zur Geige, bevor es Ihren Betrieb Implementierungen erreicht. Sie könnten eine gepufferte Kopie der Nachricht erstellen, und kopieren Sie sie in die OperationContext.Current.

hässlichen Hack natürlich, und es wird Speicher-Overhead wie jetzt zwei Kopien der Nachricht bedeutet schweben über für jede Anforderung.

Andere Tipps

Haben schauen Sie auf dem System.Web.Request.InputStream Eigentum? Es sollte genau, was Sie wollen.

Wie "zurückspulen", um die Input Property.

    if (Request.InputStream.Position != 0)
    {
        Request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
    }

Eine weitere Option, die Sie in aussehen sollte, ist die Erfassung dieser Informationen mit einem Httpmodule auf dem Beginrequest Ereignis. Die Daten sollten es bei Beginrequest Ereignis sein, weil ich WCF die Anforderung erst nach PostAuthenticateEvent nimmt nicht glauben.

unter ASP.NET (ASP Web-Service unter IIS) der folgende Code hilft:

if (request.InputStream.Position != 0)
{
  request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
}

WCF vielleicht anders (dh Sie verfügt Input nach dem Lesen)

Verwenden Fiedler. Frei von MS. Funktioniert prima.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top