【问题标题】:Different behaviors calling a WCF server side method through its WinForm or through WCF通过 WinForm 或 WCF 调用 WCF 服务器端方法的不同行为
【发布时间】:2012-10-12 11:53:40
【问题描述】:

我正在编写一个需要“双重”用户界面的程序:第一个是经典的 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 服务器代码中所做的一切在称为 trough WCF 的方法中是完全不可见的。有办法避免这种行为吗?

【问题讨论】:

    标签: c# wcf asynchronous methods call


    【解决方案1】:

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

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

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

    【讨论】:

    • 首先感谢您的回答!但是……也许我不清楚……我正在准备第二个用户界面,这样用户就可以单击按钮而无需坐在运行 WF 应用程序的计算机前。在此示例中,我完全希望 MessageBox 仅在服务器上显示其弹出窗口。 WP7 仅用于远程控制应用程序。此外,我可以使用 System.Diagnostics.Debug.Print(x.ToString()) 代替 MessageBox 或设置断点并在调试过程中检查 x 值,并获得相同的结果。
    • 嘿 Stefano - 对任何中间理解感到抱歉 :)
    • WCF 不适用于 UI,如果您继续计划进行组合实现,它将使您的代码中充满 if 语句。我会选择继承或组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 2014-01-12
    • 1970-01-01
    • 2010-10-31
    • 2011-11-21
    相关资源
    最近更新 更多