Web 服务错误 400 - 错误请求
Web Service Error 400 - Bad Request
我有一个困惑的问题。我有 Web 服务 A(以后称为 WSA),一个 3.5 .Net WCF,我已经添加了对 Web 服务 B(以后称为 WSB)的调用,它是一个 3.5 .Net ASMX。当客户端(SOAPUI 或 WCFStorm)中的 运行 WSA 时,根据客户端超时设置,WSB 调用超时。
在 VS 事件查看器中,我可以看到对 WSB 的调用立即引发了两个错误 400:
Exception thrown: 'System.Net.WebException' in System.dll ("The remote
server returned an error: (400) Bad Request."). Exception thrown:
'System.Net.WebException' in System.dll ("The remote server returned
an error: (400) Bad Request.")
没有给出原因。令我困惑的是错误并没有引起我的注意。当我调试并遇到调用 WSB 的代码行时,就像重置一样。没有进一步的代码被执行,我的 WSA 也没有抛出错误。
如果我直接调用 WSB,就可以了。所以 WSB 没有任何问题。在一位同事的建议下,我采用了特定于我的更改的代码并将其放入独立服务中。我从字面上 C&P 代码和配置设置特定于我并调整命名空间和 class 名称。瞧,它起作用了。我的名为 WSB 的独立 Web 服务很好,并获得了我期望的数据。
我和一位同事检查了 WSB 所在的 IIS 服务器上的日志(服务的 IIS 日志和 HTTPERR 日志),看看是否提到了 400 错误。我们找到了 none。
所以我们现在有点困惑。我们唯一能想到的可能是网络配置中的某些东西可能会干扰但不知道它可能是什么。
如果您对其他地方有任何建议会有所帮助。
很高兴知道为什么它没有落入我的错误处理程序。
谢谢。
更新:要求我添加配置和代码。老实说,我认为这不会有帮助,而且非常简单。由于公司原因,我不能放真正的代码,但基本上是这样的:
在网络配置中:
<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>
尽管数据非常小,但我确实尝试进行较大的 reader 设置,例如:
<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>Iп kX M3 ~vY ) X e Z
w ~ :jv -ݴwڽHb Yqv A :(Q Z; >9W O0g 6 .ɖVlU Ţ 8Z
< ( t eSv U]r R $N \
一些奇怪的编码?至少这是另一个线索。
想让您知道这个问题已经解决了。另一位开发人员之前曾从事这项服务,但不再只是碰巧路过,我说 "Hey! Look at this!"
他们看到了垃圾请求数据,表示"That looks like compression. Look up compression in the project."
原来有一个自定义压缩组件正在压缩服务的传出数据,您需要添加 2 行代码来解压缩。将这些行添加到我的方法的顶部后,一切都立即起作用。
这里的教训是,如果您的项目正在做一些违背理性的奇怪事情,请尝试找到尽可能多的人,即使他们已经不再从事这项工作了。
我有一个困惑的问题。我有 Web 服务 A(以后称为 WSA),一个 3.5 .Net WCF,我已经添加了对 Web 服务 B(以后称为 WSB)的调用,它是一个 3.5 .Net ASMX。当客户端(SOAPUI 或 WCFStorm)中的 运行 WSA 时,根据客户端超时设置,WSB 调用超时。
在 VS 事件查看器中,我可以看到对 WSB 的调用立即引发了两个错误 400:
Exception thrown: 'System.Net.WebException' in System.dll ("The remote server returned an error: (400) Bad Request."). Exception thrown: 'System.Net.WebException' in System.dll ("The remote server returned an error: (400) Bad Request.")
没有给出原因。令我困惑的是错误并没有引起我的注意。当我调试并遇到调用 WSB 的代码行时,就像重置一样。没有进一步的代码被执行,我的 WSA 也没有抛出错误。
如果我直接调用 WSB,就可以了。所以 WSB 没有任何问题。在一位同事的建议下,我采用了特定于我的更改的代码并将其放入独立服务中。我从字面上 C&P 代码和配置设置特定于我并调整命名空间和 class 名称。瞧,它起作用了。我的名为 WSB 的独立 Web 服务很好,并获得了我期望的数据。
我和一位同事检查了 WSB 所在的 IIS 服务器上的日志(服务的 IIS 日志和 HTTPERR 日志),看看是否提到了 400 错误。我们找到了 none。
所以我们现在有点困惑。我们唯一能想到的可能是网络配置中的某些东西可能会干扰但不知道它可能是什么。
如果您对其他地方有任何建议会有所帮助。
很高兴知道为什么它没有落入我的错误处理程序。
谢谢。
更新:要求我添加配置和代码。老实说,我认为这不会有帮助,而且非常简单。由于公司原因,我不能放真正的代码,但基本上是这样的:
在网络配置中:
<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>
尽管数据非常小,但我确实尝试进行较大的 reader 设置,例如:
<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>Iп kX M3 ~vY ) X e Z w ~ :jv -ݴwڽHb Yqv A :(Q Z; >9W O0g 6 .ɖVlU Ţ 8Z < ( t eSv U]r R $N \
一些奇怪的编码?至少这是另一个线索。
想让您知道这个问题已经解决了。另一位开发人员之前曾从事这项服务,但不再只是碰巧路过,我说 "Hey! Look at this!"
他们看到了垃圾请求数据,表示"That looks like compression. Look up compression in the project."
原来有一个自定义压缩组件正在压缩服务的传出数据,您需要添加 2 行代码来解压缩。将这些行添加到我的方法的顶部后,一切都立即起作用。
这里的教训是,如果您的项目正在做一些违背理性的奇怪事情,请尝试找到尽可能多的人,即使他们已经不再从事这项工作了。