C# 通过WinForm或WCF调用WCF服务器端方法的不同行为
我正在编写一个需要“双”用户界面的程序:第一个是典型的windows窗体,第二个是通过windows phone设备。我正在使用WCF(异步,这个设备唯一的可能性),但我有一个行为对我来说非常奇怪。嗯,我对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() {
[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语句。我会选择继承或创作。