Обратный вызов успеха jQuery вызывается с пустым ответом, когда метод WCF выдает исключение

Я рву на себе волосы из-за этого, так что несите меня (это длинный пост).

Основная информация

  • ASP.NET 3.5 со службой WCF в режиме совместимости с ASP.NET
  • Использование jQuery с прокси-сервером этой службы для запросов AJAX
  • Пользовательский IErrorHandler и реализация IServiceBehavior для перехвата исключений и предоставления ошибок, которые сериализуются в JSON
  • . Я тестирую локально с помощью Cassini (я видел несколько потоков, которые говорят о проблемах, возникающих при локальной отладке, но работают нормально в производственной среде).

Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда из моей службы WCF генерируется исключение, обработчик success вызова $. ajax вызывает уволен. Ответ пуст, текст статуса - «Успех», а код ответа - 202 / Принято.

Реализация IErrorHandler действительно используется, потому что я могу пройти через нее и наблюдать, как создается сообщение FaultMessage. В итоге происходит то, что обратный вызов success вызывает ошибку, потому что текст ответа пуст, когда он ожидает строку JSON. Ошибка обратного вызова никогда не срабатывает.

Одна вещь, которая дала небольшое понимание, - это удаление параметра enableWebScript из поведения конечной точки. Когда я это сделал, произошли две вещи:

  1. Ответы больше не были упакованы (т.е. нет {d: "result"} , только "result" ).
  2. ошибка обратный вызов запущен, но ответ - это только HTML-код сообщения 400 / Bad Request, "желтый экран смерти" от IIS, а не моя сериализованная ошибка.

Я пробовал столько всего, что отображается в 10 или более результатах поиска Google относительно случайных комбинаций ключевых слов "jquery ajax asp.net wcf faultcontract json", поэтому, если вы планируете поиск ответа в Google, не беспокойтесь. Я надеюсь, что кто-то в SO уже сталкивался с этой проблемой раньше.

В конечном итоге я хочу достичь:

  1. Уметь генерировать любой тип исключения в методе WCF
  2. Используйте a FaultContact
  3. Перехват исключений в ShipmentServiceErrorHandler
  4. Возвращает сериализованный ShipmentServiceFault (как JSON) клиенту.
  5. Ошибка обратный вызов вызван, поэтому я могу обработать пункт 4.

Возможно связано с:


Обновление 1

Я изучил выходные данные трассировки активности System.ServiceModel, и в какой-то момент после вызова метода UpdateCountry выдается исключение , сообщение

Сервер возвратил недопустимую ошибку SOAP.

и все. Внутреннее исключение жалуется на то, что сериализатор ожидает другой корневой элемент, но я не могу расшифровать что-то еще.


Обновление 2

Итак, после некоторой возни у меня есть кое-что для работы, хотя и не так Считаю идеальным. Вот что я сделал:

  1. Удален параметр из раздела поведения конечной точки файла web.config.
  2. Удален атрибут FaultContract из метода службы.
    
        
        
            
                
                    
                    
                
            
            
                
                    
                    
                    
                
            
        
        
            
                
            
        
        
            
                
            
        
    
    

    Заметки

    Я заметил, что этот вопрос становится избранным. Я действительно нашел решение этой проблемы, и я надеюсь дать ответ, когда у меня будет время. Следите за обновлениями!

16
задан Community 23 May 2017 в 12:11
поделиться