【问题标题】:WinRT - consume WCF serviceWinRT - 使用 WCF 服务
【发布时间】:2012-12-12 21:45:12
【问题描述】:

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

【问题讨论】:

    标签: wcf windows-runtime named-pipes


    【解决方案1】:

    首先你需要切换到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

    【讨论】:

    • bassicHttpBinding 不支持双工消息交换模式,还是我错了?
    • 哦..顺便说一句..由于 WinRT 的性质,您最好使用推送通知而不是轮询!
    • 看起来很有希望,但是这种方法需要对现有服务进行大修,这本身就是一个项目。
    • @StaWho 关于 LoopbackExempt:它仅用于开发目的,以便您可以让服务和应用程序在同一台计算机上运行。 Windows 应用商店应用只有在部署时才允许访问其他计算机上的服务。
    【解决方案2】:

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

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 好的,完成.. :) 感谢您的建议,虽然链接是我自己的博客,而且不太可能更改。
    • 也许您还可以包含一个简短的 sn-p 代码来演示此类的用法。您不必摘录整篇文章 - 因为这会破坏首先拥有博客的目的 - 但我们希望答案尽可能独立,提供更多链接作为补充阅读.
    • 完成。对不起,我是新来的!
    猜你喜欢
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 2011-08-10
    • 2014-07-13
    相关资源
    最近更新 更多