Wcf 通道工厂

Wcf ChannelFactory

我对 WCF 和 Channel Factory 的使用有疑问。

主机上:

[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();
        }
    }

}

如果我添加客户端作为服务参考,它会完美运行。我可以收到 "ALEX - Correct" 消息。

当我在 WcfTestClient.exe 上测试时,它运行良好。

但是,我在使用上述代码在 Winform 上使用时遇到了问题。 当我检查 WcfServer 跟踪日志和消息日志时;

System.NullReferenceException - Object reference not set to an instance of an object. Line number:22

第 22 行: p.Name.ToString() 在主机的 GetMessage.cvs.cs 文件中。

我认为,主机没有问题。问题出在客户端。

想请教一下我客户端是怎么出错的?

此致。

正如评论中提到的,要解决您唯一要做的就是将命名空间属性添加到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; }
}

结果。

如果有什么我可以帮忙的,请随时告诉我。