C# 通过WinForm或WCF调用WCF服务器端方法的不同行为

C# 通过WinForm或WCF调用WCF服务器端方法的不同行为,c#,wcf,asynchronous,methods,call,C#,Wcf,Asynchronous,Methods,Call,我正在编写一个需要“双”用户界面的程序:第一个是典型的windows窗体,第二个是通过windows phone设备。我正在使用WCF(异步,这个设备唯一的可能性),但我有一个行为对我来说非常奇怪。嗯,我对WCF非常基础,所以可能我做错了什么。我编写了一个更简单的WCF服务器代码版本,因此这里的问题更清楚: [ServiceContract] public partial class Form2 : Form { int x = 0; public Form2() {

我正在编写一个需要“双”用户界面的程序:第一个是典型的windows窗体,第二个是通过windows phone设备。我正在使用WCF(异步,这个设备唯一的可能性),但我有一个行为对我来说非常奇怪。嗯,我对WCF非常基础,所以可能我做错了什么。我编写了一个更简单的WCF服务器代码版本,因此这里的问题更清楚:

[ServiceContract]
public partial class Form2 : Form
{
    int x = 0;

    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        prova1();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        x++;
    }

    [OperationContract]
    void prova1()
    {
        MessageBox.Show("x = " + x.ToString());
    }

如果我点击按钮2,然后点击按钮1,我显然会得到一个带有“x=1”的弹出框。但如果我通过windows phone应用程序调用prova1(),我将始终得到“x=0”。这是一个非常普遍的行为:如果我在WCF服务器的代码中实例化一个对象,并尝试通过外部设备在WCF服务器的方法中使用它,我将得到一个空引用异常。似乎我在WCF服务器代码中所做的一切在名为Tour WCF的方法中都是完全不可见的。有一种方法可以避免这种行为?

当您在windows窗体的程序上下文中从类本身调用
prova1
时。这将使
MessageBox
静态方法对您可用,您可以使用
Show
方法显示弹出窗口

但是,当您从WP7调用服务器时,您是从完全不同的应用程序上下文访问该类,因此,即使
MethodBox.Show
有效,它也会在服务器上显示消息框,而不是在电话上。但是WCF没有为在应用程序上下文中运行准备类,并且整个
Show
方法失败


因此,您将涉及WP7和托管WCF服务的服务器/客户端场景与Windows窗体应用程序的单程序上下文混淆了。

首先,感谢您的回答!但是…也许我不清楚…我正在准备第二个用户界面,这样用户无需坐在运行WF应用程序的计算机前即可单击按钮。在本例中,我希望MessageBox仅在服务器上显示其弹出窗口。WP7仅用于远程控制应用程序。此外,在调试过程中,我可以使用System.Diagnostics.Debug.Print(x.ToString())或设置断点并检查x值,而不是MessageBox,并且获得了相同的结果。嘿,Stefano-对于任何误解,我很抱歉:)WCF不是用于UI的,如果您继续计划进行组合实现,它将使您的代码充满if语句。我会选择继承或创作。