【问题标题】:Service reference instead of Web reference in a Metro AppMetro 应用程序中的服务引用而不是 Web 引用
【发布时间】:2012-09-18 13:14:32
【问题描述】:

我正在寻找一种从 NET 4.0 应用程序使用此 Web 服务的方法:

http://resultsservice.lottery.ie/ResultsService.asmx

像往常一样,我将服务引用添加到服务中,显然代理已创建,一切看起来都很正常,但是调用“GetResults”方法会引发异常:

var service = new LotteryResultsServiceSoapClient("LotteryResultsServiceSoap");
var results = service.GetResults(DrawType.EuroMillions, 1);

对象引用未设置为对象的实例。

这种情况很少见,因为该服务的其他方法 (GetProjectedJackpot) 运行良好。 我尝试添加 Web 引用而不是服务引用,令人惊讶的是……它工作正常。所以,也许我做错了什么。

问题是我无法使用网络引用,因为我想将此应用程序移植到 WindowsRT,而 Metro 应用程序不支持网络引用。

【问题讨论】:

    标签: wcf soap service windows-8


    【解决方案1】:

    Web Reference 生成的代理在传出 HTTP 消息的标头中包含一个 User-Agent 值。默认情况下,服务参考生成的代理不添加此值。幸运的是,这种行为有据可查。

    空对象异常似乎是由于服务引用代理中缺少 User-Agent 值造成的。 Web 参考填充的值是 Mozilla/4.0(兼容;MSIE 6.0;MS Web 服务客户端协议 4.0.30319.269)。使用 Charles Proxy,我能够验证将这个值添加到服务参考生成的所有传出 HTTP 消息中可以解决您的问题。

    WCF 提供了几种可能的方法来修改传出的soap 消息和HTTP 请求。 Here 是一篇非常棒的文章,它讨论了其中的几个解决方案并包含一些很好的代码示例。

    【讨论】:

    • 这个解决方案(客户端消息检查器)对我的 NET 4.0 应用程序非常有用,现在可以正常工作了!但是我无法将其应用于 Metro 应用程序,因为 WinRT 中不允许存在一些 System.Configuration 依赖项...
    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多