WCF OperationFormatter обнаружил недопустимое тело сообщения - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть задача объединить проект wcf в проект web api.Я скопировал файлы .svc и svc.cs и часть web.config в проект web api, обновив имена сервисов, чтобы они ссылались на файлы svc в проектах web api и конечные точки для ссылки на интерфейсы вобщий проект.

Создается проект веб-API, и я проверяю, работает ли служба WCF, введя путь к одной из служб: http://localhost/WebAPI_Interface/Test.svc Это дает веб-страницу, сообщающую мне, что я создалслужба (поэтому нет ошибок конфигурации).

Я хочу проверить одну из операций службы getavailablelibraries.Контракт на операции выглядит следующим образом:

[OperationContract(Action = "getavailablelibraries")]
[WebInvoke(Method = "POST", UriTemplate = "getavailablelibraries", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
Libraries getavailablelibraries(SystemAuthentication auth);

В Fiddler я настроил запрос POST: http://localhost/WebAPI_Interface/Test.svc/getavailablelibraries

с заголовком: Content-Type: application / json и телом сообщения:

{
"auth": {
      "username" : "Test",
      "password" : "Test",
      "systemname" : "Test"
  }
}

Выполнение этого запроса возвращает ошибку 504.Я включил трассировку WCF и обнаружил, что при обработке сообщения выдается следующее исключение:

OperationFormatter обнаружил недопустимое тело сообщения.Предполагается найти тип узла «Элемент» с именем «root» и пространством имен «».Найден тип узла None с именем '' и пространством имен ''

В Fiddler, когда я пытаюсь выполнить тот же запрос на старой службе WCF, он выполняется с 200.

Если я повторяю то же самоезапрос, но на этот раз без тела сообщения, на этот раз я обнаружил, что оно возникает в отладчике в getavailablelibraries, а переменная auth имеет значение null.Так что, похоже, проблема десериализации json в класс SystemAuthentication, однако тот же самый json работает с исходным проектом WCF, поэтому я в растерянности.

Есть идеи?

EDIT: Я пытался добавить атрибуты Namespace и Name в ServiceContract и DataContract, но все равно получаю ту же ошибку.Я переключил BodyStyle = WebMessageBodyStyle.Bare, и это приводит к другой ошибке:

Невозможно десериализовать тело XML с корневым именем '' и корневым пространством имен '' (для операции 'getavailablelibraries' и контракта ('ProcessExport','http://www.myurl.com/services')) с использованием DataContractSerializer. Убедитесь, что тип, соответствующий XML, добавлен в коллекцию известных типов службы.

Также оригинальный сервис wcf перестает работать, когда я изменяю BodyStyle на Bare:Тип контракта данных «Services.SystemAuthentication» не может быть десериализован, так как не найдены необходимые члены данных «пароль, имя системы, имя пользователя».

Дополнительная информация, трассировка стека ошибок:

в System.ServiceModel.Dispatcher.DataContractJsonSerializerOperationFormatter.ValidateTypeObjectAttribute (читатель XmlDictionaryReader, логическое значение isRequest) в System.ServiceModel.Dispatcher.DataContractJsonSerializerOperationFormatter.DeserializeSionaderader Xml (, Строковое действие, MessageDescription messageDescription, параметры Object [], Boolean isRequest) в System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents (сообщение-сообщение, параметры Object [], Boolean isRequest) в System.ServiceModel.Dispatcher.OperationFormatter.DeserializeRe, Параметры Object []) в System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest (сообщение-сообщение, параметры Object []) в System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest (параметры сообщения, Object [] параметрыMerliserMerSer.DerviceMer.DerviceMerisDerviceMer.Der).СвойствоProcessMessage5 (MessageRpc & rpc) в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41 (MessageRpc & rpc) вSystem.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & RPC) в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31 (MessageRpc & RPC) в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3 (MessageRpc & RPC) в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2 (MessageRpc & rpc) в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11 (MessageRpc & rpc) в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1 (системный_каталог)ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump (запрос RequestContext, Boolean cleanThread, OperationContext currentOperationContext) в System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest (запрос RequestContext, OperationContext currentOperationConync.HackSync.Exservice.Sync.RuSecMacSecMextSecTM) вt) в System.ServiceModel.Dispatcher.ChannelHandler.OnAsyncReceiveComplete (результат IAsyncResult) в System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame (результат IAsyncResult) в System.ServiceModel.Diagnostis0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0>обратный вызов, результат IAsyncResult) в System.Runtime.AsyncResult.Complete (логическое завершение завершено синхронно) в System.Runtime.InputQueue 1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue 1.EnqueueAndDispatch (элемент Item, логическое значение canDispatchOnThisThread * * 3.EueUnueTueQueпункт, Action dequeuedCallback, Boolean canDispatchOnThisThread) в System.ServiceModel.Channels.HttpPipeline.EnqueueMessageAsyncResult.CompleteParseAndEnqueue (IAsyncResult результат) в System.ServiceModel.Channels.HttpPipeline.EnqueueMessageAsyncResult.HandleParseIncomingMessage (IAsyncResult результат) в System.Runtime.AsyncResult.SyncContinue (IAsyncResultрезультат) в System.ServiceModel.Channels.HttpPipeline.EnqueueMessageAsyncResult..ctor (ReplyChannelAcceptor acceptptor, Action dequeuedCallback, конвейер HttpPipeline, обратный вызов AsyncCallback, состояние объекта) в System.ServiceModel.Channels.HttpPipeline.EmptyHttpPipeline.BeginProcessInboundRequest (replyChannelAcceptor1.ProcessHttpContextAsync () в System.ServiceModel.Channels.HttpChannelListener`1.BeginHttpContextReceived (контекст HttpRequestContext, действие acceptorCallback, обратный вызов AsyncCallback, состояние объекта) в System.ServiceMaseTexplayer.HPT.TecHT.HT.HostedHttpRequestAsyncResult.HandleRequest () в System.ServiceModel.Activation.HostedHttpRequestAsyncResult.BeginRequest () в System.ServiceModel.Activation.HostedHttpRequestAsync.k, состояние объекта) в System.ServiceModel.Activation.HostedHttpRequestAsyncResult.OnBeginRequestWithFlow (состояние объекта) в System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback (UInt32 errorCode, UlayTime_Exlayed_Expace_Exlayed_Exception_Ont_File.No).(Ошибка UInt32, UInt32 bytesRead, NativeOverlapped * nativeOverlapped) в System.Threading._IOCompletionCallback.PerformIOCompletionCallback (UInt32 errorCode, UInt32 numBytes, NativeOverlapped * pOVERLAP)

1044

1 Ответ

0 голосов
/ 08 января 2019

Проблема возникла из-за того, что обработчик сообщений предположительно вызвал исключение.В Startup.Config проекта веб-API у нас есть строка: config.MessageHandlers.Add (new MessageLoggingHandler (ref globalLogger));

Этот класс MessageLoggingHandler наследуется от класса Microsoft DelegatingHandler и переопределяет функцию SendAsync длясделать некоторые записи, когда звонки веб-API сделаны.Мы вставляем проверку и вызываем определение базового класса, если Uri запроса содержит «.svc /», и он начал работать, так что предположительно код регистрации специфичен для запросов web api.

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