0

只是了解 WCF,所以请原谅我的不雅编码。我遇到的问题是我似乎向我的服务提交了两次数据(见截图),即使(我认为)我只做了一次。有人可以让我知道我可能做错了什么吗?或者,如果我效率低下,甚至只是建议一种更好的方法来做到这一点。

代码如下:

public void EndOfLevel()
    {
        GlobalVariable.TotalQuestionsAsked = 10;
        GlobalVariable.CorrectDecimal = GlobalVariable.Correct / GlobalVariable.TotalQuestionsAsked;

        //Show loading screen
        UploadingScreen.Visibility = Visibility.Visible;
        //Submit this levels results.

        Service1Client client = null;
        client = new Service1Client();

            //Gather the results and details
            Result thislevel = new Result();
            thislevel.Datetime = DateTime.Now;
            thislevel.result = GlobalVariable.CorrectDecimal;
            thislevel.TimesTable = GlobalVariable.NeedsHelpWith;

            //submit them
            try
            {
                client.SubmitResultAsync(thislevel);
            }
            catch
            {
                MessageBox.Show("Error uploading data");
            }
            finally
            {
                client.Close();
                Results r3 = new Results();
                this.NavigationService.Navigate(r3);
            }



    }

WCF 测试客户端:

结果截图

干杯,尼克

4

1 回答 1

1

如果可以的话,这里有一种用于管理我们的 WPF 应用程序和我们的 WCF 服务之间的异步调用的模式。

在本节中,我们有一个服务客户端的公共访问器,它确保在调用服务方法之前与客户端的连接是打开的:

public static MyServiceClient Client
{
    get
    {
        return GetMyServiceClient();
    }
}
private static MyServiceClient client;

private static MyService.MyServiceClient GetMyServiceClient()
{
    VerifyClientConnection();

    return client;
}

private static void VerifyClientConnection()
{
    if (client == null || client.State == System.ServiceModel.CommunicationState.Closed)
    {
        client = new MyService.MyServiceClient();
    }
}

在本节中是我们的异步调用和回调模式的示例(此示例显示了我们用于将异常数据传递给我们的服务的委托和回调):

public delegate void LogExceptionCompletedEvent();
public static LogExceptionCompletedEvent LogExceptionCompleted;

public static void LogExceptionAsync(SilverlightException exception)
{
    string json = JsonConvert.SerializeObject(exception);

    Client.LogExceptionCompleted -= client_LogExceptionCompleted;
    Client.LogExceptionCompleted += client_LogExceptionCompleted;
    Client.LogExceptionAsync(json);
}

private static void client_LogExceptionCompleted(object sender, AsyncCompletedEventArgs e)
{
    if (LogExceptionCompleted != null)
    {
        LogExceptionCompleted();
    }
}

在此示例中,视图模型可以将事件处理程序附加到 LogExceptionCompleted 委托,然后在它从服务返回时接收回调的结果。

对于我们需要从应用程序进行的异步 WCF 服务调用,我们基本上重复这种模式,它使它们保持非常有条理以及可单元测试。

于 2012-04-07T04:59:29.830 回答