Может ли WCF обрабатывать идентификаторы GUID?

#c# #.net #wcf #web-services #guid

#c# #.net #wcf #веб-сервисы #guid

Вопрос:

Я спрашиваю, потому что мои модульные тесты, которые подключаются к моей локальной базе данных разработчиков, не имеют проблем с использованием идентификаторов Guid, но когда я использую те же методы через свою службу WCF, происходит сбой со следующим исключением:

 System.Data.EntityCommandExecutionException
 

Я читал, что WCF преобразует идентификаторы Guid в строки. Мой точный сценарий таков:

Прокси -сервер -> передать объект с идентификатором Guid

Service <- подключение к базе данных, вставка / извлечение данных с идентификатором Guid

Сервис -> передать объект с идентификатором Guid обратно прокси-серверу

Вот ошибка при тестировании службы WCF из веб-приложения:

[FaultException`1: произошла ошибка при выполнении определения команды. Подробности см. во внутреннем исключении.]
 System.Runtime.Удаленное управление.Прокси.RealProxy.HandleReturnMessage(iMessage reqMsg, iMessage retMsg)  9456095
 System.Runtime.Удаленное управление.Прокси.RealProxy.PrivateInvoke(MessageDataamp; msgData, тип Int32)  345
 BusinessServices.NGIT.ServiceContracts.IIssueTrackerService.CreateIssue(запрос CreateIssueRequest)  0
 NGIT.Proxy.c__DisplayClass1.b__0(IIssueTrackerService s) в D:NextGenIssueTrackerbranches2011UpdatesNextGenIssueTracker .Прокси  Прокси  IssueTrackerProxy.cs:25
 NGIT.Прокси.UseServiceFunction.UseService(ChannelFactory`1 ChannelFactory, функция `2 useService) в D:NextGenIssueTrackerbranches2011UpdatesNextGenIssueTracker .Прокси  Помощники  UseServiceFunction.cs:26
 NGIT.Прокси.IssueTrackerProxy.CreateIssue(запрос CreateIssueRequest) в D:NextGenIssueTrackerbranches2011UpdatesNextGenIssueTracker .Прокси  Прокси  IssueTrackerProxy.cs:25
 NGIT.Test.ClientProxy.По умолчанию.createIssueButtonClick(отправитель объекта, EventArgs e) в D:NextGenIssueTrackerbranches2011UpdatesNGIT.Test.ClientProxyDefault.aspx.cs:36
 System.Web.UI.WebControls.Пуговица.OnClick(EventArgs e)  118
 System.Web.UI.WebControls.Кнопка.RaisePostBackEvent(Строка eventArgument)  112
 System.Web.UI.WebControls.Кнопка.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(Строка eventArgument)  10
 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler SourceControl, строка eventArgument)  13
 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)  36
 System.Web.UI.Page.ProcessRequestMain(логические includeStagesBeforeAsyncPoint, логические includeStagesAfterAsyncPoint)  5563

И вот внутреннее исключение из средства просмотра трассировки:

System.Data.EntityCommandExecutionException, System.Data.Entity, Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken=b77a5c561934e089
При выполнении определения команды произошла ошибка. Подробности см. Во внутреннем исключении.

в System.Data.EntityClient.Определение Entitycommand.ExecuteStoreCommands(EntityCommand entityCommand, поведение CommandBehavior)
в System.Data.Objects.Объектконтекст.CreateFunctionObjectResult[TElement](EntityCommand entityCommand, EntitySet EntitySet, EdmType edmType, MergeOption MergeOption)
в System.Data.Objects.Объектконтекст.ExecuteFunction[TElement](Строковое функциональноеимя, MergeOption MergeOption, параметры ObjectParameter[])
в System.Data.Objects.ObjectContext.ExecuteFunction[TElement](Строковое имя функции, параметры ObjectParameter[])
в NGIT.Data.Особенности использования.CreateIssue(строка issueTitle, Строка nextGenUserId, обнуляемый идентификатор guid `1) в D:NextGenIssueTrackerbranches2011UpdatesNextGenIssueTracker .Data UserIssueObjectGenerator.cs: строка 305
на свободе.Хранилище данных.NGIT.SqlUserIssueRepository.AddIssue(Пользователь user, Выпуск issue) в D:NextGenIssueTrackerbranches2011UpdatesDataAccess.NextGenIssueTrackerRepositoriesSqlUserIssueRepository.cs:line 51
в BusinessServices.NGIT.ServiceImplementations.IssueTrackerService.CreateIssue(запрос CreateIssueRequest) в D:NextGenIssueTrackerbranches2011UpdatesBusinessServices.NextGenIssueTrackerServiceImplementationsIssueTrackerService.cs:line 59
при SyncInvokeCreateIssue(Объект , Объект[] , Объект[])
в системе.Служебная модель.Диспетчер.SyncMethodInvoker.Вызов (экземпляр объекта, входные данные объекта [], Объект [] и выходные данные)
в системе.Служебная модель.Диспетчер.Время выполнения диспетчерской операции.InvokeBegin(MessageRpc и rpc)
в системе.Служебная модель.Диспетчер.Неизменяемое время выполнения.ProcessMessage5(MessageRpc и rpc)
в системе.Служебная модель.Диспетчер.Неизменяемое время выполнения.ProcessMessage41(MessageRpc и rpc)
в системе.Служебная модель.Диспетчер.Неизменяемое время выполнения.ProcessMessage4(MessageRpc и rpc)
в системе.Служебная модель.Диспетчер.Неизменяемое время выполнения.ProcessMessage31(MessageRpc и rpc)
в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage3(MessageRpc и rpc)
в системе.Служебная модель.Диспетчер.Неизменяемое время выполнения.ProcessMessage2(MessageRpc и rpc)
в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage11(MessageRpc и rpc)
в системе.Служебная модель.Диспетчер.Неизменяемое время выполнения.ProcessMessage1(MessageRpc и rpc)
в системе.Служебная модель.Диспетчер.MessageRpc.Process(логический isOperationContextSet)


Комментарии:

1. Тип исключения подразумевает, что это исключение, связанное с данными. Можете ли вы опубликовать полное исключение (сообщение, тип трассировка стека)?

2. Я не уверен, что тип данных GUID совместим. Вы пробовали просто заменить строку?

3. И что такое внутреннее исключение из EntityCommandExecutionException этого?

Ответ №1:

Да. (.NET GUID -> Строка Java)

Конечно, в чем заключается реальная проблема, нельзя определить только с помощью того, что вы опубликовали.

Комментарии:

1. Сохраните его в закладках, потому что, если вы планируете предоставлять свой сервис клиентам Java, очень удобно знать, чего им следует ожидать и с какими проблемами вы столкнетесь.

Ответ №2:

Я использовал WCF с объектами на основе GUID без каких-либо проблем. Я не думаю, что это ваша проблема здесь или как-то связано с WCF, если уж на то пошло. Это больше похоже на проблему на уровне вашей базы данных:

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