Как узнать, что является причиной неправильного запроса 400 http, возвращенного службой отдыха WCF во время отладки - PullRequest
0 голосов
/ 05 декабря 2018

Многие посты здесь на SO просят помощи в решении 400 http неправильных запросов.Однако я не смог найти сообщение, в котором объясняется, как получить основную причину исключения.

Предположим, что и поставщик, и клиент работают с .NET, а также предположим, что у нас время отладки:

  1. Если я поставщик веб-услуг, как я могу убедиться, что клиент получит причину неправильного запроса?(Я пытался украсить класс веб-службы атрибутом [ServiceBehavior(IncludeExceptionDetailInFaults = true)], но, похоже, это не имеет никакого эффекта).

  2. Если я являюсь клиентом веб-службы, как я могу увидеть, чтопричина плохого запроса?

1 Ответ

0 голосов
/ 05 декабря 2018

Вы можете попробовать включить исключение в сбое в службе отдыха.

catch (Exception ex)
            {
                Log.Fatal("Could not complete process", ex);
                throw new WebFaultException<string>(
                       string.Format(ex.Message),
                            HttpStatusCode.BadRequest);
            }

Приведенный выше код будет обрабатывать оба сценария, при условии, что у вас включен регистратор, вы можете просто получить файлы журнала на сервере.клиент получит сообщение об исключении

Полагаю, вы могли бы просто отправить клиенту дружеское сообщение, чтобы они ничего не касались вашей конкретной реализации, или просто создать класс, который вы можете вызвать

WebFaultException

с.

РЕДАКТИРОВАТЬ 2

Если вы получаетеперед тем, как получить запрос, попробуйте следующее

Добавить FaultHandler в свою службу

[System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
    public class GenericErrorHandlingBehavior : Attribute, IErrorHandler, IServiceBehavior
    {
        public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
        {
            //throw new NotImplementedException();
        }

        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            //throw new NotImplementedException();
            // Adds a CoreServiceBehavior to each ChannelDispatcher
            foreach (var channelDispatcherBase in serviceHostBase.ChannelDispatchers)
            {
                var channelDispatcher = channelDispatcherBase as ChannelDispatcher;
                channelDispatcher.ErrorHandlers.Add(new GenericErrorHandlingBehavior());
            }
        }

        public bool HandleError(Exception error)
        {
            //throw new NotImplementedException();
            return true;
        }

        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            if (error is FaultException)
                return;//nothing to do if the error is a fault

            //the type cannot be determined[ default to this value]
            var exception = new FaultException<GenericServiceFault>(
                new GenericServiceFault(), new FaultReason(error.Message));

            MessageFault messageFault = exception.CreateMessageFault();
            fault = Message.CreateMessage(version, messageFault, exception.Action);

        }

        public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            //throw new NotImplementedException();
        }
    }

Класс GenericServiceFault - это просто простой класс DataContract. Вы можете затемЗарегистрируйте ошибку в методе ProvideFaultMethod или HandleError и предоставьте пользователю значимую ошибку

. Вы можете использовать GenericErrorHandlingBehavior в своей реализации сервиса в качестве атрибута, то есть [GenericErrorHandlingBehavior]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...