Этот вопрос появляется снова и снова. Это не было проблемой для .NET и Silverlight, но с другой стороны, с тех пор я никогда не видел способа указывать известные типы без физического ввода их в свой ServiceContract. Это означает, что этот список нельзя динамически изменять во время выполнения. Это проблема в Xamarin, UWP и, возможно, в других платформах. Итак, давайте посмотрим на это.WCF - указать известные типы (стандарт PCL/.NET)
Первоначально одно решение этой проблемы на .NET и Silverlight был указать способ получения известных типов на ServiceKnownType так:
[ServiceKnownType("GetKnownTypes", typeof(GetTypesHelper))]
Это всегда хорошо работала на .NET и Silverlight, но он не работает на UWP или Xamarin. Я пробовал это сегодня, и это ошибка, которую я получаю:
System.InvalidOperationException: ServiceKnownTypeAttribute указывает метод GetKnownTypes в типе Adapt.XivicClient.WCF.ServiceContracts.GetTypesHelper, которого не существует. Метод должен быть статическим и принимает один параметр типа ICustomAttributeProvider
Конечно, библиотеки PCL и .NET Standard не имеют класса ICustomAttributeProvider, поэтому этого не может быть сделано. Итак, я пробовал это другое возможное решение: https://stackoverflow.com/a/2104482/1878141
Это работает, указав поведение службы. Но, опять же, PCL и Standard не имеют класса IServiceBehavior и не говорят Android.
Я пробовал этот код, потому что я думал, что могу заменить DataContractSerializer, но я получаю NotImplementedException на Android.
dataAccessServiceClient.Endpoint.EndpointBehaviors.Add(new XivicServicBehaviour());
public class XivicServicBehaviour : IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
}
public void Validate(ServiceEndpoint endpoint)
{
}
}
Итак, какие у нас варианты?
возможность перехода на дизайн REST API всегда есть. Даже для WCF сами известные типы менее рекомендуются. –
Да. Я просто говорил об этом в моей команде. Вероятно, я смогу портировать наш код в REST в конечном итоге, но есть много вызовов, и кажется смешным идти на все эти проблемы, когда WCF работает отлично. Я не знаю, что вы имеете в виду, когда говорите, что известные типы менее рекомендуются. Известные типы лежат в основе сериализации WCF. –