WinRT-使用WCF服务

WinRT-使用WCF服务,wcf,windows-runtime,named-pipes,Wcf,Windows Runtime,Named Pipes,我有一个windows服务,它充当从外部源接收的数据的传播程序。此windows服务承载具有NetNamedPipeBinding的WCF ServiceHost。ServiceContract还定义了CallbackContract 还有一个客户端DLL组件,它使用服务器并将解析的数据冒泡为事件。数据在接收到来自服务器的回调时冒泡 该代码在桌面应用程序中工作,但是,当我尝试在WinRT应用程序中引用客户端DLL时,出现以下错误: 无法获取管道URI的管道名称:访问被拒绝。5,0x5 据我所知,

我有一个windows服务,它充当从外部源接收的数据的传播程序。此windows服务承载具有NetNamedPipeBinding的WCF ServiceHost。ServiceContract还定义了CallbackContract

还有一个客户端DLL组件,它使用服务器并将解析的数据冒泡为事件。数据在接收到来自服务器的回调时冒泡

该代码在桌面应用程序中工作,但是,当我尝试在WinRT应用程序中引用客户端DLL时,出现以下错误:

无法获取管道URI的管道名称:访问被拒绝。5,0x5

据我所知,这可能是因为WinRT缺乏对命名管道的支持


如何在WinRT中使用这样的服务?我可以根据任何要求更改WCF端,但它必须作为windows服务托管,因为它具有非WinRT使用者。通信总是在同一台机器内进行,轮询是最后的手段。

首先,您需要切换到basicHttpBinding,因为不支持net.namedpipe

实际上支持的是BasicHttpBinding、NetTcpBinding、NetHttpBinding

其次,在WinRT中有一个适当的策略,它阻止您通过网络堆栈访问本地主机

要克服此安全策略,您需要为应用程序添加一个环回豁免

CheckNetIsolation.exe LoopbackExempt -s
请参阅MSDN的详细信息:

对于双工方式,当应用程序处于聚焦状态时,两种轮询方式中的任何一种都只起作用


或者使用推送通知:

使用HttpClient类。。这是唯一简单的解决方法,也很有效

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/xml"));
httpClient.DefaultRequestHeaders.Add("SOAPAction", "http://ws.cdyne.com/WeatherWS/GetCityWeatherByZIP");
var soapXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body><GetCityWeatherByZIP xmlns=\"http://ws.cdyne.com/WeatherWS/\"><ZIP>23454</ZIP></GetCityWeatherByZIP></soap:Body></soap:Envelope>";
var response = httpClient.PostAsync("http://wsf.cdyne.com/WeatherWS/Weather.asmx", new StringContent(soapXml, Encoding.UTF8, "text/xml")).Result;
var content = response.Content.ReadAsStringAsync().Result;

试试这个?我希望这就是您想要的-

bassicHttpBinding不支持双工消息交换模式,还是我错了?哦。。顺便说一下。。由于WinRT的性质,您最好使用推送通知,而不是轮询!看一下推送通知。看起来很有希望,但是这种方法需要对现有服务进行重大改革,这本身就是一个项目。@StaWho关于环回豁免:它仅用于开发目的,因此您可以在同一台计算机上运行服务和应用程序。Windows应用商店应用程序仅允许在部署时访问其他计算机上的服务。虽然此链接可以回答此问题,但最好在此处包含答案的基本部分,并提供此链接以供参考。如果链接页面发生更改,则仅链接答案可能无效。确定,完成..:谢谢你的建议,虽然链接是到我自己的博客,而且不太可能改变。也许你也可以包含一小段代码来演示这个类的用法。你不必摘录你的全部文章——因为这首先会挫败建立博客的目的——但我们希望答案尽可能独立,提供更多的链接作为补充阅读。完成。对不起,我是新来的!