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



我正在编写一个需要"双重"UI的程序:第一个是经典的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 服务器的方法(通过外部设备调用)中使用它,我将得到一个 null 引用异常。似乎我在 WCF 服务器代码中所做的一切都在称为槽式 WCF 的方法中完全不可见。有没有办法避免这种行为?

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

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

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

最新更新