#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 Представляет ошибки, возникающие, когда базовый поставщик хранилища не смог выполнить указанную команду. Это исключение обычно включает исключение, зависящее от конкретного поставщика.