我正在尝试使用WCF从另一个应用程序中获取对象。使用内置类,它工作正常但我在尝试从WCF操作返回自定义接口类型时遇到了probems。
无论是单独在两个应用程序中包含接口,还是将其指定为共享程序集,我都会得到相同的结果:一个CommunicationException,消息“从管道读取错误:无法识别的错误109”。
界面如下所示:
[ServiceContract]
public interface IBase {
int IntTest {
[OperationContract]
get;
}
String StringTest {
[OperationContract]
get;
}
IOther OtherTest {
[OperationContract]
get;
}
}
[ServiceContract]
public interface IOther {
String StringTest {
[OperationContract]
get;
}
}
我的服务器看起来像这样:
public partial class MainWindow : Window {
private Base fb;
private ServiceHost host;
public MainWindow() {
InitializeComponent();
fb = new Base();
host = new ServiceHost(fb, new Uri[] { new Uri("net.pipe://localhost") });
host.AddServiceEndpoint(typeof(IBase), new NetNamedPipeBinding(),
"PipeReverse");
host.Open();
}
private void Window_Closing(object sender, CancelEventArgs e) {
host.Close();
}
}
这是我对界面的实现:
[Serializable]
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class Base : MarshalByRefObject, IBase {
public int IntTest {
get { return 4; }
}
public string StringTest {
get { return "A string from Base"; }
}
public IOther OtherTest {
get { return new Other(); }
}
}
[Serializable]
[DataContract]
public class Other : MarshalByRefObject, IOther {
[DataMember]
public string StringTest {
get { return "A string from Other"; }
}
}
客户端看起来像这样:
public partial class Form1 : Form {
IBase obj;
public Form1() {
InitializeComponent();
ChannelFactory<IBase> pipeFactory = new ChannelFactory<IBase>(
new NetNamedPipeBinding(), new EndpointAddress(
"net.pipe://localhost/PipeReverse"));
obj = pipeFactory.CreateChannel();
}
private void button2_Click(object sender, EventArgs e) {
Console.WriteLine("Returns: " + obj.StringTest + " " +
obj.StringTest.Length);
Console.WriteLine("Returns: " + obj.IntTest);
Console.WriteLine(obj.OtherTest);
}
}
除了这一行之外,一切都像魅力一样:
Console.WriteLine(obj.OtherTest);
它给我一个CommunicationException,并显示消息“从管道读取错误:无法识别的错误109”。据我所知,由于故障状态导致管道损坏,但我无法弄清楚原因,或者更重要的是如何修复它。有什么想法吗?
我没有配置文件,因为上面的代码已经完成,所以我不知道如何打开跟踪,否则我也会包括它。
答案 0 :(得分:2)
返回的属性 OtherTest 需要是具体类型而不是接口,否则序列化将无效。
答案 1 :(得分:0)
这通常是序列化错误。查看[KnownType]属性。测试它的最简单方法是直接调用DataContractSerializer。您可以使用其WriteObject和ReadObject方法来获取真正的序列化错误。您还可以检查流(通常是FileStream)以确保正确键入序列化。