Wcf ChannelFactory - PullRequest
       50

Wcf ChannelFactory

0 голосов
/ 11 февраля 2019

У меня есть вопрос об использовании 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 Trace Log и Message Log;

System.NullReferenceException - Ссылка на объект не установлена ​​на экземпляр объекта.Номер строки: 22 * ​​1016 *

Номер строки 22: p.Name.ToString () в файле GetMessage.cvs.cs хоста.

Я думаю, что тамнет проблем на хосте.Проблема на стороне клиента.

Я хотел бы спросить вас, как я допустил ошибку на стороне клиента?

С уважением.

1 Ответ

0 голосов
/ 13 февраля 2019

Как уже упоминалось в комментариях, чтобы решить проблему, которую вам нужно только сделать, это добавить свойство пространства имен в 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; }
}

Результат.
enter image description here
Не стесняйтесь, дайте мне знать, если я могу чем-то помочь.

...