我有一个令人困惑的问题。我有一个Web服务A(以下称为WSA),一个3.5 .Net WCF,我已经添加了对Web服务B(以下称为WSB)的调用,这是一个3.5 .Net ASMX。在客户端(SOAPUI或WCFStorm)中运行WSA时,WSB调用会根据客户端超时设置超时。
在VS事件查看器中,我可以看到对WSB的调用会立即抛出两个错误400:
抛出异常:System.dll中的“System.Net.WebException”(“远程 server返回错误:(400)Bad Request。“)。抛出异常: System.dll中的“System.Net.WebException”(“远程服务器已返回 错误:(400)错误请求。“)
没有理由。对我来说同样令人费解的是这个错误并不适合我。当我调试并且我点击调用WSB的代码行时,它就像重置一样。没有进一步的代码被执行,我的WSA也没有抛出任何错误。
如果我直接调用WSB,它就可以了。所以WSB没有问题。在一位同事的建议下,我根据我的变化采取了特定的代码并将其置于一个独立的服务中。我字面意思是C& P代码和配置设置特定于我并调整名称空间和类名。瞧,它看起来有效。我的独立Web服务称为WSB,并且可以获得我期望的数据。
一位同事和我检查了WSB所在的IIS服务器上的日志(服务的IIS日志和HTTPERR日志),看看是否有任何提及400的错误。我们找不到。
所以我们在这一点上感到困惑。我们唯一能想到的可能是网络配置中的某些东西可能会干扰但不知道它可能是什么。
如果您有任何建议可以提供帮助。
很高兴知道为什么它不会落入我的错误处理程序。
感谢。
更新:请求我添加配置和代码。我不认为这会有所帮助,而且非常简单。由于公司的原因,我无法提供真正的代码,但基本上就是这样:
在网络配置中:
<configuration>
<appSettings>
<add key="endpointUrl" value = "someurl" />
</appSettings>
.
.
.
<applicationSettings>
<MyService.Properties.Settings>
<setting name="MyService_TheirService"
serializeAs="String">
<value>someurl</value>
</setting>
</MyService.Properties.Settings>
</applicationSettings>
尽管数据非常小,但我确实尝试进行大型阅读器设置等等:
<binding name="CustomHtttpBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" closeTimeout="01:50:00" openTimeout="01:50:00" sendTimeout="01:50:00" receiveTimeout="01:50:00" >
<readerQuotas maxDepth="128"
maxStringContentLength="8388608"
maxArrayLength="2147483646"
maxBytesPerRead="4096"
maxNameTableCharCount="16384" />
</binding>
代码:
using MyService.TheirService
.
.
.
var theirURL = ConfigurationManager.AppSettings["endpointUrl"];
var oSvc = new TheirServiceObject
{
Url = theirURL
};
int numberIneed = oSvc.SomeMethod();
最后一行是投掷400的地方。
更新2:
一位同事告诉我如何使用Fiddler。我现在可以看到对WSB的请求是绝对垃圾。
xڭs 6 mr !! u \ .3 5'3 G QOH&gt;IпkX M3~vY)X e Z w~:jv-ݴwڽHbYqv A:(Q Z;> 9W O0g 6.ɖVlUŢ8Z &LT; (t eSv U] r R $ N \
有些奇怪的编码?至少这是另一条线索。
答案 0 :(得分:0)
想要让你知道这个问题已经解决了。另一个开发过这项服务的开发人员,但不再只是偶然走过去,我说“嘿!看看这个!”
他们看到垃圾请求数据并说“看起来像压缩。在项目中查找压缩。”
结果是有一个自定义压缩组件压缩了服务的传出数据,你需要添加2行代码来解压缩。将这些行添加到我的方法的顶部后,一切都立即起作用。
这里的教训是,如果你的项目正在做一些违背理性的奇怪的东西,试着找到尽可能多的人,即使他们不再在它上面工作了。