#silverlight #wcf #ria #wcf-ria-services #domainservices
#silverlight #wcf #ria #wcf-ria-services #domainservices
Вопрос:
У меня очень странная проблема: я разрабатываю бизнес-приложение Silverlight с использованием служб RIA.
У меня есть несколько DomainServices на стороне сервера, и с одним из них у меня возникает проблема, из-за того, что иногда вызов одного из методов завершается с ошибкой (на клиенте SL я получаю исключение «NotFound», и событие request не поступает на сервер (я ввел точку останова в конструктор domainservice)!
Что делает вещи странными еще больше:
- Если вызов с SL-клиента завершается с ошибкой, тогда я запускаю Fiddler2, тогда второй (или любой последовательный) вызов работает должным образом! Если я закрою fiddler, он снова станет нестабильным.
- Если я переименую метод, который я хотел бы вызвать (через рефакторинг), также вызывайте переименованный метод в контексте на стороне клиента SL, тогда каждый раз, когда я выполняю вызов, он успешен!
Вот мой метод suspicios:
[Invoke]
public void RegisterTrainingProgramCompletion(bool isCompleted, int result, string sportsManNote)
{
//...
}
Если я переименую этот метод в «RegisterTpCompletion», то он работает (невероятно)!
Служба домена помечена некоторыми атрибутами:
[EnableClientAccess()]
[RequiresAuthentication()]
public class NextTrainingProgramDomainService : DomainService
Мне удалось каким-то образом зарегистрировать серверную часть и получить следующее исключение из стека WCF:
Существует проблема с XML, который был получен из сети. Более подробную информацию см. во внутреннем исключении. в системе.ServiceModel.Каналы.HttpInput.Декодируйте Bufferedmessage (буфер ArraySegment`1, поток ввода) в системе.ServiceModel.Каналы.HttpInput.ReadBufferedMessage (поток входных данных) в системе.ServiceModel.Каналы.HttpInput.Разбирайте приходящее сообщение (исключение и requestException) в системе.ServiceModel.Каналы.HttpChannelListener.HttpContextReceived (контекст HttpRequestContext, обратный вызов действия) в системе.ServiceModel.Активация.HostedHttpTransportManager.HttpContextReceived(HostedHttpRequestAsyncResult result) в системе.ServiceModel.Активация.HostedHttpRequestAsyncResult.handleRequest() в системе.ServiceModel.Активация.HostedHttpRequestAsyncResult.BeginRequest() в системе.ServiceModel.Активация.HostedHttpRequestAsyncResult.onBeginRequest (состояние объекта) в системе.ServiceModel.AspNetPartialTrustHelpers.PartialTrustInvoke (обратный вызов ContextCallback, состояние объекта) в системе.ServiceModel.Активация.HostedHttpRequestAsyncResult.OnBeginRequestWithFlow(состояние объекта) в системе.Время выполнения.IOThreadScheduler.ScheduledOverlapped.Обратный вызов IOCallback (код ошибки UInt32, количество байтов UInt32, NativeOverlapped* nativeOverlapped) в System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame (ошибка UInt32, UInt32 bytesRead, NativeOverlapped* nativeOverlapped) в системе.Многопоточность._IOCompletionCallback.Выполните обратный вызов (код ошибки UInt32, количество байтов UInt32, NativeOverlapped* pOVERLAP)
Значит, по какой-то неизвестной причине clint (SL-app) не выполняет надлежащую очистку запроса? Я начинаю беспокоиться : (((
Мои вызывающие абоненты (клиент SL) проходят проверку подлинности с помощью пользовательских форм аутентификации.
Я знаю, вы могли бы сказать, оставьте все как есть, но это сводит меня с ума, я хочу знать, в чем проблема, чтобы я больше с этим не сталкивался.
Спасибо!
Bye, Csabi
Комментарии:
1. Я только что прочитал ваш пост давным-давно, но столкнулся с аналогичной ошибкой (время от времени нет правильного доступа к моим объектам RIA) возможно, вы лучше поняли, что пошло не так, и хотели бы поделиться. вы все еще верите, что длина URL-адреса или его название были вашей проблемой? Спасибо Csabi.
2. Ramnz: ничего не помогло, кроме переименования функции. Я разместил этот вопрос во многих местах, например, на форуме RIAs, и я не получил надлежащего ответа (даже не «ок, извините, это ошибка».
Ответ №1:
Я подозреваю, что это проблема с URL, в основном URL может быть длиной всего в несколько КБ. Теперь я не знаю размер, но в службах RIA он использует URL для отправки вашего фильтра в виде строки запроса.
И имена вашего метода также большие, он достигает максимального предела URL. Когда он работает даже с big name, ваша часть фильтра может быть пустой, но если вы добавите больше фильтров, вы столкнетесь с ошибками.
Комментарии:
1. Дорогой Акаш, спасибо за твой ответ, но я тоже думал об этом и переименовал метод в «RegisterTrainingProgramCompletionXXX», и он сработал как по волшебству (3 из 3 раз)! Затем, когда я переименовал его обратно в «RegisterTrainingProgramCompletion», он снова завершается с ошибкой. Это полное безумие! Я искал строку «RegisterTrainingProgramCompletion» во всем решении и не нашел соответствующего вредоносного кода.
2. Хорошо, я думаю, что проблема может быть в постфиксе завершения. Например, это может предполагать, что имя метода завершение является своего рода контрольной точкой в его собственной внутренней логике. Я видел сбой WCF, когда мы используем string в качестве параметра и отправляем пользовательский XML, который намеренно конфликтует с именами, используемыми в WPF, и мы получаем ошибку 400, поскольку запрос не был понят.
3. Привет 🙂 Я переименовал его в «RegisterTrainingProgramCompletio» (без ‘n’ в конце), и это работает. Затем я подумал, что, возможно, проблема в завершении <EntitiyName>, поэтому я переименовал его в RegisterTrainingProgramHistoryCompletion (TPH также является объектом, таким же, как TP), и это сработало как шарм 🙂 Я переименовал его обратно в RegisterTrainingProgramCompletion и снова сбой 🙂 Не могу поверить.