2009-03-16 3 views
4

У нас есть службы WCF (.NET 3.5 SP1) работает в IIS7, который помечен, чтобы режим совместимости с ASP.NET, поэтому мы можем получить доступ к HttpContext.Current:HttpRequest.ServerVariables бросает ArgumentException в WCF с IIS7

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

Тем не менее, при попытке получить доступ к любой переменной сервера он бросает ArgumentException:

System.ArgumentException: Value does not fall within the expected range. 
    at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) 
    at System.Web.Hosting.IIS7WorkerRequest.GetServerVariableInternal(String name) 
    at System.Web.Hosting.IIS7WorkerRequest.GetServerVariable(String name) 
    at System.Web.Hosting.IIS7WorkerRequest.GetRemoteAddress() 
    at System.Web.HttpRequest.get_UserHostAddress() 

например Любой из следующих строк выбрасывайте это исключение:

ha = HttpContext.Current.Request.UserHostAddress; 
ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
us = HttpContext.Current.Request.UserAgent; 

Это, как представляется, является результатом внутреннего каркаса вызова, что означает, что вызывающий код не виноват.

Предположительно, в нашей конфигурации есть что-то, что вызывает эту проблему, но я не знаю, что. Есть идеи? Или любые идеи, как еще я могу получить эти три бита данных (они, кажется, не отображаются WCF изначально, к сожалению).

ответ

11

Оказывается, проблема заключается в том, что операция помечается ...

[OperationContract(IsOneWay = true)] 

... и что переменные сервера недоступны в однонаправленные операции.

Позор исключение не говорит об этом ...

+0

Я просто ударил эту стену. Так много для атрибута IsOneWay. :( –

+0

Спасибо, Грег, вы спасли меня несколько часов. – patelsan

+0

есть способ обнаружить это, так что я могу избежать использования серверных переменных? – user230910