1

我有一个 Windows 服务,它充当从外部源接收的数据的传播者。此 Windows 服务ServiceHost使用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 消费者)。通信总是发生在同一台机器内,轮询是最后的手段。

4

2 回答 2

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-sumption-a-wcf-asmx-web-service-in-winrt/

于 2015-02-11T06:11:14.070 回答
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

于 2012-12-12T21:50:33.900 回答