Wcf Metro应用程序中的服务引用而不是Web引用

Wcf Metro应用程序中的服务引用而不是Web引用,wcf,soap,service,windows-8,Wcf,Soap,Service,Windows 8,我正在寻找一种从NET 4.0应用程序中使用此web服务的方法: 像往常一样,我将服务引用添加到服务中,显然代理已创建,一切似乎正常,但是调用“GetResults”方法会引发异常: var service = new LotteryResultsServiceSoapClient("LotteryResultsServiceSoap"); var results = service.GetResults(DrawType.EuroMillions, 1); 对象引用未设置为对象的实例 这种

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

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

var service = new LotteryResultsServiceSoapClient("LotteryResultsServiceSoap");
var results = service.GetResults(DrawType.EuroMillions, 1);
对象引用未设置为对象的实例

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


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

web引用生成的代理在传出HTTP消息的标头中包含用户代理值。默认情况下,服务引用生成的代理不会添加此值。幸运的是,这种行为有很好的记录

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

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

此解决方案(客户端消息检查器)对我的NET 4.0应用程序非常有用,现在运行良好!但是,我无法将其应用于metro应用程序,因为存在一些WinRT中不允许的System.Configuration依赖项。。。