Были ли у кого-нибудь проблемы со связью между двумя приложениями Silverlight. Когда я пытаюсь отправить сообщение из одного приложения, я получаю сообщение об ошибке: «Сообщение не может быть доставлено получателю». Мой код для отправки ниже. Я использую аналогичный код из примеров для реализации Windows Live ID в приложении Silverlight. У меня это работает, когда я работаю локально, но когда я отправляю сообщение на сервер, я получаю ошибку доставки.
#region Fields
private readonly LocalMessageSender sender = new LocalMessageSender("LiveIdAuthentication");
private int attempts = 0;
private const int MAX_ATTEMPTS = 10;
#endregion
#region Constructors
public MainPage()
{
InitializeComponent();
this.sender.SendCompleted += new EventHandler<SendCompletedEventArgs>(Sender_SendCompleted);
this.SendMessage("authenticated");
}
#endregion
#region Event Handlers
private void Sender_SendCompleted(object sender, SendCompletedEventArgs e)
{
if (e.Error != null)
{
if (attempts > MAX_ATTEMPTS)
{
MessageBox.Show(e.Error.Message);
CloseWindow();
}
else
{
SendMessage("authenticated");
}
}
else
{
attempts = 0;
CloseWindow();
}
}
#endregion
#region Methods
private void SendMessage(string message)
{
attempts++;
this.sender.SendAsync(message);
}
private void CloseWindow()
{
HtmlPage.Window.Eval("window.open(\"about:blank\", \"_self\")");
HtmlPage.Window.Eval("window.close()");
}
#endregion
Извините, что забыл приемник. Это в основном из примера Live ID.
private readonly WindowsLiveIdAuthentication _service;
private readonly AsyncCallback _asyncCallback;
private readonly object _asyncState;
private readonly LocalMessageReceiver _receiver = new LocalMessageReceiver("LiveIdAuthentication");
private bool _isCompleted;
private LoadUserResult _result;
#region Constructors
public LoginAsyncResult(WindowsLiveIdAuthentication service, AsyncCallback asyncCallback, object asyncState)
{
this._service = service;
this._asyncCallback = asyncCallback;
this._asyncState = asyncState;
this._receiver.MessageReceived += this.LocalMessageReceived;
}
#endregion
#region Properties
public object AsyncState
{
get { return this._asyncState; }
}
public System.Threading.WaitHandle AsyncWaitHandle
{
get { throw new NotImplementedException(); }
}
public bool CompletedSynchronously
{
get { return false; }
}
public bool IsCompleted
{
get { return this._isCompleted; }
}
public LoadUserResult Result
{
get { return this._result; }
}
#endregion
#region Methods
public void Cancel()
{
if (!this._isCompleted)
{
this._isCompleted = true;
}
}
public void Complete()
{
if (!this._isCompleted)
{
this._isCompleted = true;
this._receiver.Dispose();
Application.Current.RootVisual.Dispatcher.BeginInvoke(() =>
{
if (this._asyncCallback != null)
{
this._asyncCallback(this);
}
});
}
}
#endregion
#region Event Handlers
public void HandleLoadCallback(IAsyncResult asyncResult)
{
this._result = this._service.EndLoadUser(asyncResult);
if (!this._result.User.Identity.IsAuthenticated && !this._isCompleted && (this != asyncResult.AsyncState))
{
this._receiver.Listen();
}
else
{
this.Complete();
if (Globals.CurrentUser == null)
{
Globals.CurrentUser = _result.User as User;
Globals.SelectedDate = DateTime.Now;
(App.Current.RootVisual as MainPage).SetTheme(Globals.CurrentUser.CurrentTheme);
HtmlPage.Window.Navigate(new Uri("#UserHome", UriKind.Relative));
}
}
}
private void LocalMessageReceived(object sender, MessageReceivedEventArgs e)
{
this._service.BeginLoadUser(this.HandleLoadCallback, this);
}
#endregion
UPDATE:
Хорошо, я обнаружил, что произошел сбой вызова службы RIA, что привело к тому, что не вызывался получатель.Listen (). Таким образом, не было получателя для отправителя для отправки сообщений. Я все еще работаю над неудавшимся вызовом службы RIA, но это другая проблема. Я отмечу это как ответ.