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 - Ссылка на объект не установлена на экземпляр объекта. Номер строки:22
Строка № 22: p.Name.ToString () в файле GetMessage.cvs.cs хоста.
Думаю, на хосте проблем нет. Проблема на стороне клиента.
Я хотел бы спросить вас, как я допустил ошибку на стороне клиента?
С уважением.
1 ответ
Как упоминалось в комментариях, чтобы решить проблему, которую вам нужно только сделать, это добавить свойство пространства имен в 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; }
}
Результат.
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.