我有一个关于WCF和通道工厂使用的问题。
关于东道:
[ServiceContract]
public interface IGetMessage
{
[OperationContract]
string ShowMessage(Sample p, string Username, string Password);
}
[DataContract]
public class Sample
{
[DataMember]
public string Name { get; set; }
}
public string ShowMessage(Sample p, string Username, string Password)
{
return p.Name.ToString() + " - " + "Correct"; //Error line
}关于客户:
[ServiceContract()]
public interface IGetMessage
{
[OperationContract()]
string ShowMessage(Sample p, string Username, string Password);
}
[DataContract()]
public class Sample
{
[DataMember]
public string Name { get; set; }
}
private void button1_Click(object sender, EventArgs e)
{
Sample p1 = new Sample();
p1.Name = "ALEX";
BasicHttpBinding myBinding = new BasicHttpBinding();
EndpointAddress myEndpoint = new EndpointAddress("http://MYURL/GetMessage.svc");
using (var myChannelFactory = new ChannelFactory<IGetMessage>(myBinding, myEndpoint))
{
IGetMessage client = null;
try
{
client = myChannelFactory.CreateChannel();
MessageBox.Show(client.ShowMessage(p1, "abc","123"));
((ICommunicationObject)client).Close();
myChannelFactory.Close();
}
catch
{
(client as ICommunicationObject)?.Abort();
}
}
}如果我将客户端添加为服务引用,它就能很好地工作。我能收到“亚历克斯-正确”的信息。
当我在WcfTestClient.exe上测试时,它运行得非常完美。
但是,当在Winform上使用上述代码时,我遇到了一个问题。当我检查WcfServer跟踪日志和消息日志时;
System.NullReferenceException -对象引用没有设置为对象的实例。线路号码:22
第22行:主机的p.Name.ToString()文件上的GetMessage.cvs.cs。
我想,主人没有问题。问题在于客户端。
我想问你我是怎么在客户端犯错误的?
致以问候。
发布于 2019-02-13 05:52:25
正如注释中提到的,要解决问题,只需将命名空间属性添加到ServiceContract和DataContract。确保客户端和服务器之间的命名空间是相同的。我们应该这样做的原因是在序列化和反序列化过程中发生了错误,我们必须确保服务契约和数据契约在服务器和客户端之间有一个一致的命名空间。
下面是我的示例(在服务器和客户端上添加此功能)。
[ServiceContract(Namespace ="http://mydomain")]
public interface IGetMessage
{
[OperationContract]
string ShowMessage(Sample p, string Username, string Password);
}
[DataContract(Namespace = "http://mydomain")]
public class Sample
{
[DataMember]
public string Name { get; set; }
}结果。

如果有什么需要我帮忙的,请随时通知我。
https://stackoverflow.com/questions/54637084
复制相似问题