Если вы создаете сервис без интерфейса, вы теряете возможность создавать канал на лету в своем коде. Тогда единственный способ получить доступ к сервису - добавить ссылку на сервис.
Пробовал со стандартным шаблоном службы WCF VS 2015; помечает класс обслуживания с помощью ServiceContract и методы с атрибутом OperationContract . Реализация интерфейса IService1 удалена (реализация интерфейса отсутствует).
[ServiceContract]
public class Service1
{
[OperationContract]
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
[OperationContract]
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite == null)
{
throw new ArgumentNullException("composite");
}
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
С этим изменением мы не можем создать канал прокси на лету, который я пробовал с приведенным ниже фрагментом кода.
BasicHttpBinding myBinding = new BasicHttpBinding();
EndpointAddress myEndpoint = new EndpointAddress("http://localhost:59420/Service1.svc");
// InvalidOperationException is thrown as below line
// Error message "The type argument passed to the generic ChannelFactory class must be an interface type"
ChannelFactory<Service1> myChannelFactory = new ChannelFactory<Service1>(myBinding, myEndpoint);
// Create a channel.
Service1 wcfClient1 = myChannelFactory.CreateChannel();
Console.WriteLine(wcfClient1.GetData(1));
Console.ReadKey();
Если мы используем и реализуем интерфейс, как показано ниже
public class Service1 : IService1
тогда код ниже работает без проблем. Пожалуйста, теперь Service1 теперь заменяется интерфейсом IService1 при создании объекта ChannelFactory.
ChannelFactory<IService1> myChannelFactory = new ChannelFactory<IService1>(myBinding, myEndpoint);
Это наиболее важный аспект, если ваш клиент использует ChannelFactory вместо ServiceReference для доступа к службе.