
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.141.196.215] |
![]() |
|
Сообщ.
#1
,
|
|
|
Есть WCF-служба, работает по SOAP (wsHttpBinding). В ней есть метод, он принимает параметр сложного типа. На этот тип повешан DataContract. Всё работает.
![]() ![]() [ServiceContract()] public interface IPublicService { [OperationContract] Boolean DoSomething(Parameter obj); } Проблема возникает, когда клиент шлёт службе SOAP-сообщение (по HTTP), в теле которого неверно задан этот параметр. Лишнее поле там в нём или опечатка какая. В этом случае клиент сразу получает "The remote server returned an error: (500) Internal Server Error." на свой веб-запрос. При этом в трейсе сервера видно вполне вменяемое исключение: Цитата <ExceptionType>System.ServiceModel.Dispatcher.NetDispatcherFaultException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType> <Message>The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter obj. The InnerException message was 'There was an error deserializing the object of type Parameter. Start element 'a:Name' does not match end element 'obj'. Line 33, position 9.'. Please see InnerException for more details.</Message> ... тут ещё трейс, и все внутренние исключения ... (в SOAP задано лишнее поле Name) Я бы хотел, чтобы клиент таки увидел это сообщение и знал как исправиться. А он видит только HTTP 500... "IncludeExceptionDetailInFaults = true" не помогает. Как я понимаю, это только для исключений, который возникают в коде службы. Как жить то? |
Сообщ.
#2
,
|
|
|
Если сервис хоститься на IIS и ASP.Net life cycle ему не чужд - можно попробовать в global.asax.cs - на событие "Application_Error" - подправить Response...
что-то вроде: ![]() ![]() protected void Application_Error(object sender, EventArgs e) { Exception ex = Server.GetLastError(); HttpContext.Current.Response."На что с душой договорились"; } а в клиенте соотв. это дело чекать (что и как чекать - дело договоренностей сервера и клиента). |
Сообщ.
#3
,
|
|
|
Ой! забыл закрыть запрос. я решил проблему - просто надо было заглянуть в body http-ответа. там лежали всё отчёты об ошибках нужные.
|