Я хочу настроить исключения / ошибки, создаваемые моей службой данных WCF, чтобы клиенты получали как можно больше информации о том, что именно пошло не так / чего не хватает. Есть мысли о том, как этого можно достичь?
Обработка исключений с помощью служб данных WCF
Ответы (4)
Есть несколько вещей, которые вам нужно сделать, чтобы исключения передавались клиенту через HTTP-канал.
Вы должны присвоить своему классу DataService следующее:
[ServiceBehavior (IncludeExceptionDetailInFaults = true)] открытый класс MyDataService: DataService
Вы должны включить подробные ошибки в конфигурации:
общедоступный статический void InitializeService (конфигурация DataServiceConfiguration) {config.UseVerboseErrors = true; }
Лучше всего выбросить DataServiceException внутри. Среда выполнения WCF Data Service знает, как сопоставить свойства с ответом HTTP, и всегда будет заключать его в TargetInvocationException.
[WebGet]
public Entity OperationName(string id)
{
try
{
//validate param
Guid entityId;
if (!Guid.TryParse(id, out entityId))
throw new ArgumentException("Unable to parse to type Guid", "id");
//operation code
}
catch (ArgumentException ex)
{
throw new DataServiceException(400, "Code", ex.Message, string.Empty, ex);
}
}
Затем вы можете распаковать это для клиента-потребителя, переопределив HandleException в своем DataService следующим образом:
/// <summary>
/// Unpack exceptions to the consumer
/// </summary>
/// <param name="args"></param>
protected override void HandleException(HandleExceptionArgs args)
{
if ((args.Exception is TargetInvocationException) && args.Exception.InnerException != null)
{
if (args.Exception.InnerException is DataServiceException)
args.Exception = args.Exception.InnerException as DataServiceException;
else
args.Exception = new DataServiceException(400, args.Exception.InnerException.Message);
}
}
См. здесь для получения дополнительной информации ...
Вы можете украсить свой класс обслуживания этим атрибутом ServiceBehaviorAttribute следующим образом:
[ServiceBehavior(IncludeExceptionDetailInFaults=true)]
public class PricingDataService : DataService<ObjectContext>, IDisposable
{
...
}
Для этого вам нужно создать собственные исключения. Прочтите этот пост здесь: Зачем создавать пользовательские исключения?
На каком языке ты развиваешься?
Если вам нужны дополнительные указания, пожалуйста, добавьте несколько комментариев.
Я не думаю, что он хочет знать, как генерировать / перехватывать исключения в .NET.
Он, вероятно, хочет узнать, как сообщить клиентам, использующим службу данных WCF, что что-то (и что) пошло не так, когда на стороне сервера (службы) возникает / перехватывается исключение.
Службы данных WCF используют сообщения HTTP-запроса / ответа, и вы не можете просто передать исключение из службы клиенту.