"Создатель этой вины не указал причину" исключения
У меня есть следующий код в службе WCF, чтобы вызвать пользовательскую ошибку на основе определенных ситуаций. Я получаю исключение" создатель этой ошибки не указал причину". Что я делаю не так?
//source code
if(!DidItPass)
{
InvalidRoutingCodeFault fault = new InvalidRoutingCodeFault("Invalid Routing Code - No Approval Started");
throw new FaultException<InvalidRoutingCodeFault>(fault);
}
//operation contract
[OperationContract]
[FaultContract(typeof(InvalidRoutingCodeFault))]
bool MyMethod();
//data contract
[DataContract(Namespace="http://myuri.org/Simple")]
public class InvalidRoutingCodeFault
{
private string m_ErrorMessage = string.Empty;
public InvalidRoutingCodeFault(string message)
{
this.m_ErrorMessage = message;
}
[DataMember]
public string ErrorMessage
{
get { return this.m_ErrorMessage; }
set { this.m_ErrorMessage = value; }
}
}
10 ответов
после некоторых дополнительных исследований, следующий измененный код:
if(!DidItPass)
{
InvalidRoutingCodeFault fault = new InvalidRoutingCodeFault("Invalid Routing Code - No Approval Started");
throw new FaultException<InvalidRoutingCodeFault>(fault, new FaultReason("Invalid Routing Code - No Approval Started"));
}
короткий ответ: вы не делаете ничего плохого, просто неправильно прочитав результаты.
на стороне клиента, когда вы ловите ошибку, то, что поймано, имеет тип System.ServiceModel.FaultException<InvalidRoutingCodeFault>
.
Ваш
serviceDebug includeExceptionDetailInFaults="true"
- это не решение проблемы
следующий код работает даже с serviceDebug includeExceptionDetailInFaults="false"
// data contract
[DataContract]
public class FormatFault
{
private string additionalDetails;
[DataMember]
public string AdditionalDetails
{
get { return additionalDetails; }
set { additionalDetails = value; }
}
}
// interface method declaration
[OperationContract]
[FaultContract(typeof(FormatFault))]
void DoWork2();
// service method implementation
public void DoWork2()
{
try
{
int i = int.Parse("Abcd");
}
catch (FormatException ex)
{
FormatFault fault = new FormatFault();
fault.AdditionalDetails = ex.Message;
throw new FaultException<FormatFault>(fault);
}
}
// client calling code
private static void InvokeWCF2()
{
ServiceClient service = new ServiceClient();
try
{
service.DoWork2();
}
catch (FaultException<FormatFault> e)
{
// This is a strongly typed try catch instead of the weakly typed where we need to do -- if (e.Code.Name == "Format_Error")
Console.WriteLine("Handling format exception: " + e.Detail.AdditionalDetails);
}
}
нет необходимости добавлять причину неисправности, если она не требуется. Просто убедитесь, что атрибут FaultContract является правильным
Я решил эту проблему с помощью двух званий параметр.
// service method implementation
throw new FaultException<FormatFault>(fault,new FaultReason(fault.CustomFaultMassage));
CustomFaultMassage является свойством из контракта данных.
можно также столкнуться с этим исключением, если не указать атрибут FaultContract(typeof(className)) для метода
У меня есть код точно так же, как у Рашми, и у меня есть "создатель этой ошибки...." ошибка. Это происходило, когда я отлаживал VS2010. Я нашел этот пост:
что объяснило пару вариантов отладки, которые мне нужно было отключить. Проблема решена.
Если вы не хотите получать уведомления о таких исключениях, перейдите в Debug -> Exceptions и снимите флажок "User-unhandled" для "common Language Runtime Exceptions" или для определенных исключений.
вы можете попробовать это в конфигурации сервера (поведение - > serviceBehaviors - > поведение):
<serviceDebug includeExceptionDetailInFaults="true" />
используя строго типизированную try catch, я смог обойти ошибку"создатель этой ошибки не указал причину".