如何在Windows Universal App中使用双工wcf服务

时间:2015-10-15 10:47:06

标签: c# wcf windows-10 uwp nettcpbinding

如何在Windows通用应用程序中使用双工合约来使用wcf服务?

我尝试在Windows Universal App中使用双面wcf服务时遇到PlatformNotSupportedExcetpion: Operation is not supported on this platform.运行时异常,目标是Windows 10(10.0; Build 10240)

根据msdn,它支持API。

如果不可能,我该怎么办?我在同一台机器上运行了两个应用程序(console和windows universal xaml app),我需要双向通信。

我有创建服务主机的clasic .net 4.6控制台应用程序:

var host = new ServiceHost(typeof(MyService), new Uri("net.tcp://localhost:8008/MyService"));

var binding = new NetTcpBinding(); //I've also tried net http binding
binding.Security.Mode = SecurityMode.None;

host.Description.Behaviors.Add(new ServiceMetadataBehavior());
host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, 
                        MetadataExchangeBindings.CreateMexTcpBinding(),
                        "mex");  

host.AddServiceEndpoint(typeof(IMyService), binding, "");
host.Open();

服务合同:

[ServiceContract(CallbackContract = typeof(IMyServiceCallback))]
public interface IMyService
{
    [OperationContract(IsOneWay = true)]
    void Initialize();
}

public interface IMyServiceCallback
{
    [OperationContract(IsOneWay = true)]
    void OnFrame(int i);
}

我已经通过“添加服务参考”对话框和UWP应用中的NetHttpBindingNetTcpBinding同时尝试了ChannelFactory和生成的wcf客户端。

当我尝试创建wcf客户端的实例时,它会抛出PlatformNotSupportedExcetpion。

来源:System.Private.ServiceModel

堆栈跟踪:

 at System.ServiceModel.ReflectionExtensions.GetInterfaceMap(Type type, Type interfaceType)
   at System.ServiceModel.Description.TypeLoader.GetIOperationBehaviorAttributesFromType(OperationDescription opDesc, Type targetIface, Type implType)
   at System.ServiceModel.Description.TypeLoader.<>c__DisplayClass8.<AddBehaviorsFromImplementationType>b__10(Type currentType, KeyedByTypeCollection`1 behaviors)
   at System.ServiceModel.Description.TypeLoader.AddBehaviorsAtOneScope[IBehavior,TBehaviorCollection](Type type, TBehaviorCollection descriptionBehaviors, ServiceInheritanceCallback`2 callback)
   at System.ServiceModel.Description.TypeLoader.AddBehaviorsFromImplementationType(ServiceEndpoint serviceEndpoint, Type implementationType)
   at System.ServiceModel.ChannelFactory`1.ReflectOnCallbackInstance(ServiceEndpoint endpoint)
   at System.ServiceModel.ChannelFactory`1.CreateDescription()
   at System.ServiceModel.ChannelFactory.InitializeEndpoint(Binding binding, EndpointAddress address)
   at System.ServiceModel.DuplexChannelFactory`1..ctor(Object callbackObject, Binding binding, EndpointAddress remoteAddress)
   at System.ServiceModel.ClientBase`1..ctor(InstanceContext callbackInstance, Binding binding, EndpointAddress remoteAddress)
   at System.ServiceModel.DuplexClientBase`1..ctor(InstanceContext callbackInstance, Binding binding, EndpointAddress remoteAddress)
   at App1.ServiceReference1.MyServiceClientBase..ctor(InstanceContext callbackInstance)
   at App1.ServiceReference1.MyServiceClient..ctor(MyServiceClientCallback callbackImpl)
   at App1.ServiceReference1.MyServiceClient..ctor()
   at App1.MainPage.<button_Click>d__1.MoveNext()

2 个答案:

答案 0 :(得分:4)

作为.NET Core 1.0的一部分的WCF的稳定版本于上个月发布。通过在UWP项目的project.json文件中引用5.2.2版本的WCF features包,Windows Universal Apps现在可以支持双工和许多其他Microsoft.NETCore.UniversalWindowsPlatform

答案 1 :(得分:1)

即使在10580版本(最新的.NETCore v5.1.0)中也不支持双工方案。

有一个错误报告了离线GitHub在WCF双工实现中错误使用反射。在.net核心的最新版本中修复了此错误,您可以在Nuget图库中添加individual package。但是,此程序包要求您还包括System.Runtime和System.Threading的预发布版本。

enter image description here

希望它有所帮助,