У меня есть задача объединить проект 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