Ich habe einen WCF-Dienst, der Zugriff auf einige Daten bietet. Unser Kunde hat verlangt, dass dieser Dienst so eingeschränkt wird, dass ein bestimmter Benutzer nur so viele Aufrufe innerhalb eines bestimmten Zeitraums tätigen kann. Meine Überlegung war, eine Obergrenze für die Anfragerate festzulegen und diese IP-Adresse vorübergehend zu sperren, sobald sie diese Grenze überschritten hat.
Es scheint jedoch nur eine Möglichkeit zu geben, die IP des Anrufers über WCF zu ermitteln:
var context = OperationContext.Current;
var props = context.IncomingMessageProperties;
var endpoint = props[RemoteEndpointMessageProperty.Name];
return ((RemoteEndpointMessageProperty)endpoint).Address;
Dies ist für mich überhaupt nicht nützlich, da die RemoteEndpointMessageProperty über die Request.UserHostAddress-Eigenschaft des HttpContextes, unter dem sie bereitgestellt wird, festgelegt wird. Normalerweise wäre das in Ordnung, außer dass unsere Webdienste hinter einem Load Balancer sitzen, was dazu führt, dass Request.UserHostAddress immer die IP des Load Balancers anzeigt, nicht die des ursprünglichen Aufrufers.
Ich weiß, über die Verwendung von X-Forwarded-For und so, und tatsächlich haben bereits konfiguriert, dass auf unsere Load Balancer, aber es scheint keine Möglichkeit für mich in die HTTP-Anforderung zu haken, um die Header kurz der Einstellung der WCF-Dienst im ASP.NET-Kompatibilitätsmodus zu betreiben. Ist dies WIRKLICH meine einzige Option?