【发布时间】:2016-09-09 01:37:34
【问题描述】:
这个问题一次又一次地出现。这在 .NET 和 Silverlight 上不是问题,但在其他所有平台上,我从未见过一种无需将已知类型物理输入到 ServiceContract 即可指定已知类型的方法。这意味着该列表不能在运行时动态更改。这是 Xamarin、UWP 和可能其他平台中的问题。那么,让我们看看这个。
最初,.NET 和 Silverlight 上解决此问题的一种方法是指定一种方法来获取 ServiceKnownType 上的已知类型,如下所示:
[ServiceKnownType("GetKnownTypes", typeof(GetTypesHelper))]
这在 .NET 和 Silverlight 上一直运行良好,但它不适用于 UWP 或 Xamarin。我今天试过了,这是我得到的错误:
System.InvalidOperationException:ServiceKnownTypeAttribute 指定类型 Adapt.XivicClient.WCF.ServiceContracts.GetTypesHelper 中不存在的方法 GetKnownTypes。该方法必须是静态的,并且需要一个 ICustomAttributeProvider 类型的参数
当然,PCL 和 .NET Standard 库没有 ICustomAttributeProvider 类,因此无法做到这一点。所以,我尝试了其他可能的解决方案: https://stackoverflow.com/a/2104482/1878141
这通过指定服务行为来工作。但是,PCL 和 Standard 没有 IServiceBehavior 类,Android 也没有。
我尝试了这段代码,因为我认为我可以替换 DataContractSerializer,但我在 Android 上得到了 NotImplementedException。
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 序列化的核心。
标签: c# android .net wcf xamarin