首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Wcf ChannelFactory

Wcf ChannelFactory
EN

Stack Overflow用户
提问于 2019-02-11 18:42:19
回答 1查看 446关注 0票数 1

我有一个关于WCF和通道工厂使用的问题。

关于东道:

代码语言:javascript
复制
[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
}

关于客户:

代码语言:javascript
复制
[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。

我想,主人没有问题。问题在于客户端。

我想问你我是怎么在客户端犯错误的?

致以问候。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-13 05:52:25

正如注释中提到的,要解决问题,只需将命名空间属性添加到ServiceContract和DataContract。确保客户端和服务器之间的命名空间是相同的。我们应该这样做的原因是在序列化和反序列化过程中发生了错误,我们必须确保服务契约和数据契约在服务器和客户端之间有一个一致的命名空间。

下面是我的示例(在服务器和客户端上添加此功能)。

代码语言:javascript
复制
    [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; }
}

结果。

如果有什么需要我帮忙的,请随时通知我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54637084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档