Как заставить ServiceActivationException перебрасываться через веб-сервер ASP.NET в браузер? - PullRequest
1 голос
/ 20 января 2011

У меня есть клиент Silverlight, разговаривающий с веб-сервером (который, конечно, является приложением ASP.NET), использующим WCF.

Теперь, когда настройка безопасности WCF не соответствует настройке, определенной в IIS,коммуникация не получается, конечно.Например, настройки SSL виртуального каталога могут указывать, что сертификат клиента следует игнорировать, но для конфигурации WCF может потребоваться сертификат клиента.Это конфликт.Попытка установить связь с помощью WCF от клиента Silverlight к веб-серверу приводит к NotSupportedException, который позже включается в ServiceActivationException, брошенный в рабочий процесс IIS:

System.NotSupportedException occurred
  Message=The SSL settings for the service 'SslRequireCert' does not match those of the IIS 'Ssl'.
  Source=System.ServiceModel.Activation
  StackTrace:
       at System.ServiceModel.Activation.HostedAspNetEnvironment.ValidateHttpsSettings(String virtualPath, Nullable`1& requireClientCertificate)
  InnerException: 

Однако это исключениене распространяется в браузер.Один из операторов catch, выполняемый во время разматывания стека (найденный в методе HostedHttpRequestAsyncResult.BeginRequest), проверяет метод http и, если это не GET, полностью исключает исключение:

catch (ServiceActivationException exception)
{ 
  if (string.Compare(GetHttpMethod(), "GET", StringComparison.OrdinalIgnoreCase) == 0)
  {
    if (exception.InnerException is HttpException)
    { 
      throw exception.InnerException;
    } 
    else 
    {
      throw; 
    }
  }

  SetStatusCode((int)HttpStatusCode.InternalServerError); 
  SetStatusDescription(HttpChannelUtilities.StatusDescriptionStrings.HttpStatusServiceActivationException); 
  CompleteOperation(null); 
}

(я использовал .NET Reflectorпроследите выполнение)

Теперь, хотя исходное исключение содержит очень точное описание ошибки, последнее исключение абсолютно бесполезно.

Мой вопрос, есть ли что-нибудь сделать?Можно ли заставить WCF использовать метод GET?Есть ли смысл?И как мы должны устранять подобные проблемы, если они проглочены по пути?

Заранее большое спасибо.

EDIT1

Хочу подчеркнуть, что у меня нет проблем с регистрацией этих ошибок на стороне веб-сервера.Я использую атрибут Factory метаданных @ServiceHost для определения пользовательского типа ServiceHost, где я могу регистрировать ошибки в его методе OnOpen.Проблема в том, что я хочу видеть значимые ошибки, поступающие в браузер.

EDIT2

Необходимо немного контекста.Мне нужно иметь возможность устранять неполадки при входе в систему.Все они видны в журнале веб-сервера.Однако иногда очень удобно видеть те же ошибки на стороне клиента без необходимости запрашивать файл журнала веб-сервера.Следовательно, все ошибки входа в систему выводятся на консоль отладки (видимую в DbgView) и консоль журнала браузера.Это облегчает поиск неисправностей.

...