#c# #silverlight #sharepoint-2010
#c# #silverlight #sharepoint-2010
Вопрос:
Вот код, который я использую для извлечения текущего имени пользователя из SharePoint 2010 через Silverlight:
ClientContext clientContext = ClientContext.Current;
if (clientContext == null)
{
SharepointUser = "[Unknown]";
}
else
{
MessageBox.Show("Beginning server query now...");
clientContext.Load(clientContext.Web, s => s.CurrentUser);
clientContext.ExecuteQueryAsync((s, e) =>
{
MessageBox.Show("RESPONSE!");
SharepointUser = clientContext.Web.CurrentUser.LoginName;
MessageBox.Show("Hello, " SharepointUser "!");
},
(s, e) =>
{
MessageBox.Show("An error occurred: " e.ToString());
});
}
Проблема в том, что запрос никогда не возвращается! События успеха / ошибки вообще не запускаются, и запрос просто кажется, что он уходит в пустоту.
У кого-нибудь есть какие-нибудь идеи?
Комментарии:
1. Используйте Fiddler для наблюдения за HTTP-диалогом с сервером. fiddler2.com
2. Он даже не отображается как запрошенный через мой компьютер с помощью Fiddler. Если приложение silverlight размещено на сервере и оно пытается запросить информацию с сервера sharepoint, почему трафик должен проходить через мой локальный компьютер?
3. Ваш код — это код на стороне клиента, а не на стороне сервера.
4. Достаточно справедливо, но это не объясняет, почему запрос никогда не выполняется. 🙁
Ответ №1:
Окно сообщения.Вероятно, причиной проблемы является Show. У меня была такая же проблема, и при отладке я обнаружил, что вызывает MessageBox.Показ в рамках обратных вызовов ExecuteQueryAsync вызывал исключение «Недопустимый доступ между потоками». Мне нужно было обернуть вызовы подобным образом, чтобы заставить его работать:
Deployment.Current.Dispatcher.BeginInvoke(() => MessageBox.Show("Request Suceeded"));
Ответ №2:
Попробуйте это:-
ClientContext clientContext = ClientContext.Current;
if (clientContext == null)
{
SharepointUser = "[Unknown]";
}
else
{
try
{
MessageBox.Show("Beginning server query now...");
clientContext.Load(clientContext.Web, s => s.CurrentUser);
clientContext.ExecuteQueryAsync((s, e) =>
{
MessageBox.Show("RESPONSE!");
SharepointUser = clientContext.Web.CurrentUser.LoginName;
MessageBox.Show("Hello, " SharepointUser "!");
},
(s, e) =>
{
MessageBox.Show("An error occurred: " e.ToString());
});
}
catch (Exception err)
{
MessageBox.Show("Synchronous error occurred: " err.ToString());
}
}
Если попытка запустить асинхронную операцию завершается неудачей, она обычно выдает ошибку синхронно, а не оставляет ее для асинхронного обратного вызова.
Комментарии:
1. Но вы видите сообщение «Начало …»?