WinRT - 使用WCF服务

时间:2012-12-12 21:45:13

标签: wcf windows-runtime named-pipes

我有一个Windows服务,它充当从外部源接收的数据的传播者。此Windows服务使用ServiceHost托管WCF NetNamedPipeBinding()ServiceContract还定义了CallbackContract

还有一个客户端DLL组件,它使用服务器并将解析后的数据作为事件冒泡。从服务器接收回调后,数据会冒泡。

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

The pipe name could not be obtained for the pipe URI: Access is denied. (5, 0x5)

我认为这是因为WinRT(据我所知)缺乏对命名管道的支持。

如何在WinRT中使用此类服务​​?我可以将WCF方面改为任何要求,但它必须作为Windows服务托管(它有非WinRT消费者)。通信将始终在同一台机器内进行,轮询是最后的手段。

2 个答案:

答案 0 :(得分:0)

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

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

其次在WinRT中有一个策略,阻止您通过网络堆栈访问 localhost

要克服此安全策略,您需要为您的应用添加LoopbackExempt。

CheckNetIsolation.exe LoopbackExempt -s

查看有关MSDN的详细信息: http://msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx

对于双面打印方式,POLLING是一种选择(仅在应用程序聚焦时才有效)。

或使用推送通知:http://blogs.msdn.com/b/jimoneil/archive/2012/10/15/windows-8-notifications-push-notifications.aspx

答案 1 :(得分:0)

使用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;

试试这个?我希望这是你正在寻找的 - https://quirkd.wordpress.com/2015/01/24/shorts-consuming-a-wcf-asmx-web-service-in-winrt/