Решение:
Небольшое отслеживание показало, что CommunicationException выбрасывалось, потому что была проблема с моим исключением T, не сериализовавшаяся правильно; потому что, в два слоя, у меня был анонимно напечатанный объект, который нельзя было разобрать. Удаление и всплывание изменений, казалось, исправили это. Было кое-что еще маленькое, что я делал до этого, но я не могу вспомнить, что это было, только то, что это не было сделано в конфигурации.
Я получал сообщения от моих следов, таких как:
Type 'RebuiltWCFService.Requests.HelloWorldRequest' with data contract name 'HelloWorldRequest:http://schemas.datacontract.org/2004/07/RebuiltWCFService.Requests' is not expected.
Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.
Оригинальный пост
Сегодня я столкнулся с странной проблемой, на которую просто не могу найти ответ!
Проблема: мой сервис вызывает исключение CommunicationException, когда я генерирую исключение FaultException! Это не делает это, если я не выбрасываю исключение.
В моем сервисе я правильно определяю договоры о неисправности:
[OperationContract]
[FaultContract(typeof(Faults.HelloWorldFault))]
Responses.HelloWorldResponse HelloWorld(Requests.HelloWorldRequest parameter);
Тогда в условиях ошибки я выкидываю исключение правильного типа:
if (_errors.Count() > 0)
{
Faults.HelloWorldFault fault = new Faults.HelloWorldFault(_errors);
throw new FaultException<Faults.HelloWorldFault>(fault, new FaultReason("There are one or more errors in the request. Check the 'Errors' property for more detaisl"));
}
А потом я ловлю его на стороне клиента:
try
{
response = client.HelloWorld(new BasicService.HelloWorldRequest() { Number = 49 });
client.Close();
Console.WriteLine(String.Format("Response message: {0}, Response number: {1}", response.Message, response.Number));
}
catch (FaultException<BasicService.HelloWorldFault> ex)
{
...
}
Мне кажется, что все в порядке, и вроде все должно работать. Однако, как только я иду, чтобы проверить мои предложения об ошибках (предоставляя неверные данные, такие как пропущенное поле), все это умирает от меня. Когда я выбрасываю свое FaultException, служба вместо этого выдает CommunicationException с сообщением
An error occurred while receiving the HTTP response to http://localhost:8732/Design_Time_Addresses/RebuiltWCFService/Service1/.
This could be due to the service endpoint binding not using the HTTP protocol.
This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down).
See server logs for more details.
Кто-нибудь может предложить какое-то понимание этого? Я использую привязку basicHttp, и я также попробовал это с wsHttp. Я опубликую свой конфигурационный файл по запросу.