我有一个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消费者)。通信将始终在同一台机器内进行,轮询是最后的手段。
答案 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/