当silverlight退出时如何调用webservice?我需要在silverlight退出时在服务器上发送更新。
答案 0 :(得分:3)
为Application.Exit事件添加事件处理程序。在该处理程序中调用WebService。 XAML /代码看起来像:
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SilverlightApplication.App"
Exit="App_Exit">
</Application>
和
public partial class App : Application
{
private void App_Exit(object sender, EventArgs e)
{
// Code to call WebService goes here.
}
}
答案 1 :(得分:2)
您无法在Silverlight中关闭应用程序时发出Web请求。
答案 2 :(得分:2)
我有一个需要在关闭之前保存信息的应用程序。我在托管silverlight控件的页面中使用了javascript。
Javascript和用法
<script type="text/javascript">
var blocking = true;
function pageUnloading() {
var control = document.getElementById("Xaml1");
control.content.Page.FinalSave();
while (blocking)
alert('Saving User Information');
}
function allowClose() {
blocking = false;
}
</script>
<body onbeforeunload="pageUnloading();">
</body>
和 app.xaml.cs
public partial class App : Application
{
[ScriptableMember()]
public void FinalSave()
{
srTL.TrueLinkClient proxy = new CSRM3.srTL.TrueLinkClient();
proxy.DeleteAllUserActionsCompleted += (sender, e) =>
{
HtmlPage.Window.CreateInstance("allowClose");
};
proxy.DeleteAllUserActionsAsync(ApplicationUser.UserName);
}
}
答案 3 :(得分:1)
您需要使用javascript。 查看此链接:http://danielvaughan.orpius.com/post/Calling-Web-Services-from-Silverlight-after-the-Browser-has-closed.aspx
答案 4 :(得分:0)
见Justin Niessner回答的评论:你无法取回返回值。如果您正在调用的服务不重要(因为,它只是捕获一些使用情况统计信息),那对您来说可能没问题。如果你需要在任何情况下都有返回值,并且你希望多次使用SL应用程序,你可以写一个纪念品到IsolatedStorage(这是一个同步操作)并在应用程序启动时将它发布到服务器下次。
答案 5 :(得分:0)
是的,只需进行网络服务电话,不要等待返回值..因为它不会到达
这样做:
private async void Application_Exit(object sender, EventArgs e)
{
// Tell DBSERVER_V14 pipe we have gone away
await connect_disconnect_async(MainPage.username, MainPage.website, false);
}
但不要这样做:
private async void Application_Exit(object sender, EventArgs e)
{
// Tell DBSERVER_V14 pipe we have gone away
var status = await SmartNibby_V13.connect_disconnect_async(MainPage.username, MainPage.website, false);
if (status)
{
Console.WriteLine(status);
}
}
因为你永远不会有'status'值来测试它。