Если тип, который вы хотите вернуть из вызова службы, не помечен как DataContract
, вы не сможете вернуть его из WCF, не предоставив копию этой же сборки в ваше клиентское приложение.
using System;
using System.ServiceModel;
[ServiceContract]
interface IService
{
[OperationContract]
TimeSpan GetTimeSpan();
}
class Service : IService
{
public TimeSpan GetTimeSpan() { return DateTime.Now.TimeOfDay; }
}
Почему предыдущий код работает тогда? Это работает, потому что обе стороны сервисного вызова имеют System.dll
, поэтому они оба знают о типе System.TimeSpan
, который является типом возврата OperationContract GetTimeSpan()
.
Вот пример использования DataContract
:
using System;
using System.ServiceModel;
using System.Runtime.Serialization;
[ServiceContract]
interface IService
{
[OperationContract]
Contract GetContract();
}
[DataContract]
class Contract
{
[DataMember]
public String MyProperty { get; set; }
}
class Service : IService
{
public Contract GetContract() { return new Contract(); }
}
Теперь вы предоставили атрибуты сериализации для определенного вами класса (Contract
) - это позволит вам использовать svcutil.exe
для создания прокси-классов в вашем клиентском приложении, которые будут сериализованы и отправлены службе WCF. 1016 *
Теперь, если вы хотите вернуть тип, который не является DataContract
, вы должны предоставить копию сборки, содержащей этот тип, вашему клиентскому приложению.