WebAPI 的奇怪行为 - 从不同的机器调用时响应不同
strange behavior of WebAPI - responds differently when called from different machines
我在服务器上部署了 WebAPI 服务。还有一个用于测试 API 的 MVC 应用程序。一个这样的测试器 运行s 在我的开发机器上,另一个副本(相同版本)运行s 在 API 所在的服务器上。
MVC 测试器应用程序支持直接调用 API,也支持通过 built-in 'proxy'(http 处理程序)绕过 "Access-Control-Allow-Origin" 错误。因此,例如,如果我 运行 我的开发机器上的测试应用程序并且我想从服务器接收数据,我必须使用代理。此设置运行良好,所有调用都在进行并且数据已正确传递。
当我没有提供足够的输入(用于测试目的)并且 API 生成“400 错误请求”错误时,就会出现问题。只有当我从我的开发机器调用远程机器时才会发生,如果我在服务器上进行相同的调用则工作正常。
我在远程服务器上用 Postman 进行了测试:
post directly to API: POST to 177.77.77.77/v1/feature {JSON payload}
我得到的响应包含正确的 headers,一个 body 和一个描述错误的 JSON object。当我发送完全相同的命令但通过服务器的代理时,也会发生同样的事情:
post through proxy: POST to 177.77.77.77/proxy/feature {JSON payload}
两个结果是相同的,这是预期的行为,我认为这可以得出代理正在工作并且 API 正在工作的结论。
当我回到我的开发机器并尝试相同的调用时,我直接发布到 API 的结果与上面相同,但如果我使用服务器的代理,则会发生其他情况。这是 Fiddler 的工作案例输出(从开发机器直接到 API):
POST http://177.77.77.77/v1/feature HTTP/1.1
Host: 177.77.77.77
Connection: keep-alive
Content-Length: 514
User-Agent: Mozilla/5.0 xx..
Cache-Control: no-cache
Origin: chrome-extension://xx-postman-xx
Authorization: Basic pwd=
Content-Type: application/json
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8
{payload}
回复:
HTTP/1.1 400 Bad Request
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Mon, 30 Mar 2015 15:48:52 GMT
Content-Length: 139
{"code":"INVALID_REQUEST","message":"proper error message"}
这是预期消息 body (JSON) 的正确行为,并且正确 content-lenght。如果我向服务器的代理发出请求,我的请求将变为:
POST 177.77.77.77/proxy/feature HTTP/1.1
Host: 177.77.77.77
Connection: keep-alive
Content-Length: 514
User-Agent: Mozilla/5.0 xx..
Cache-Control: no-cache
Origin: chrome-extension://xx-postman-xx
Authorization: Basic pwd=
Content-Type: application/json
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8
Cookie: appSettings=xx
{payload}
那么我得到的回复是:
HTTP/1.1 400 Bad Request
Cache-Control: private
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Mar 2015 15:51:37 GMT
Content-Length: 11
Bad Request
响应的 body/payload 丢失或被状态替换,content-type 从 JSON 更改为 text/html,并且 cache-control 变为私有。
non-working 案例中的 cookie 没有任何作用。我尝试删除它,结果仍然是错误的。
您认为为什么会发生这种情况?我如何解决这个问题并找到代码的哪一部分(或者可能是 IIS 设置?)负责为看似相同的请求发送不同的响应?毕竟,当我 运行 仅在开发人员或仅在远程时一切正常。这可能是某些权限问题还是服务器上 IIS 中的某些问题?
我尝试了 remote-debugging 的代理代码,我会在通过 Postman 发送 Post 命令(具有相同的负载)的同时单步执行代码。在一种情况下,我在服务器上 运行 Postman 并向服务器代理发出请求,在另一种情况下,我在开发人员 运行 Postman 上向服务器代理发出请求.在 VS 中,我可以看到我在两种情况下的代码中都经历了相同的路径,并且 API 的响应是相同的。
感谢阅读,如有任何帮助,我们将不胜感激!
将此添加到 web.config:
<system.webServer>
<httpErrors existingResponse="PassThrough"></httpErrors>
</system.webServer>
在这里找到了解决方案:
In IIS7.5 what module removes the body of a 400 Bad Request
我在服务器上部署了 WebAPI 服务。还有一个用于测试 API 的 MVC 应用程序。一个这样的测试器 运行s 在我的开发机器上,另一个副本(相同版本)运行s 在 API 所在的服务器上。
MVC 测试器应用程序支持直接调用 API,也支持通过 built-in 'proxy'(http 处理程序)绕过 "Access-Control-Allow-Origin" 错误。因此,例如,如果我 运行 我的开发机器上的测试应用程序并且我想从服务器接收数据,我必须使用代理。此设置运行良好,所有调用都在进行并且数据已正确传递。
当我没有提供足够的输入(用于测试目的)并且 API 生成“400 错误请求”错误时,就会出现问题。只有当我从我的开发机器调用远程机器时才会发生,如果我在服务器上进行相同的调用则工作正常。
我在远程服务器上用 Postman 进行了测试:
post directly to API: POST to 177.77.77.77/v1/feature {JSON payload}
我得到的响应包含正确的 headers,一个 body 和一个描述错误的 JSON object。当我发送完全相同的命令但通过服务器的代理时,也会发生同样的事情:
post through proxy: POST to 177.77.77.77/proxy/feature {JSON payload}
两个结果是相同的,这是预期的行为,我认为这可以得出代理正在工作并且 API 正在工作的结论。
当我回到我的开发机器并尝试相同的调用时,我直接发布到 API 的结果与上面相同,但如果我使用服务器的代理,则会发生其他情况。这是 Fiddler 的工作案例输出(从开发机器直接到 API):
POST http://177.77.77.77/v1/feature HTTP/1.1
Host: 177.77.77.77
Connection: keep-alive
Content-Length: 514
User-Agent: Mozilla/5.0 xx..
Cache-Control: no-cache
Origin: chrome-extension://xx-postman-xx
Authorization: Basic pwd=
Content-Type: application/json
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8
{payload}
回复:
HTTP/1.1 400 Bad Request
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Mon, 30 Mar 2015 15:48:52 GMT
Content-Length: 139
{"code":"INVALID_REQUEST","message":"proper error message"}
这是预期消息 body (JSON) 的正确行为,并且正确 content-lenght。如果我向服务器的代理发出请求,我的请求将变为:
POST 177.77.77.77/proxy/feature HTTP/1.1
Host: 177.77.77.77
Connection: keep-alive
Content-Length: 514
User-Agent: Mozilla/5.0 xx..
Cache-Control: no-cache
Origin: chrome-extension://xx-postman-xx
Authorization: Basic pwd=
Content-Type: application/json
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8
Cookie: appSettings=xx
{payload}
那么我得到的回复是:
HTTP/1.1 400 Bad Request
Cache-Control: private
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Mar 2015 15:51:37 GMT
Content-Length: 11
Bad Request
响应的 body/payload 丢失或被状态替换,content-type 从 JSON 更改为 text/html,并且 cache-control 变为私有。
non-working 案例中的 cookie 没有任何作用。我尝试删除它,结果仍然是错误的。
您认为为什么会发生这种情况?我如何解决这个问题并找到代码的哪一部分(或者可能是 IIS 设置?)负责为看似相同的请求发送不同的响应?毕竟,当我 运行 仅在开发人员或仅在远程时一切正常。这可能是某些权限问题还是服务器上 IIS 中的某些问题?
我尝试了 remote-debugging 的代理代码,我会在通过 Postman 发送 Post 命令(具有相同的负载)的同时单步执行代码。在一种情况下,我在服务器上 运行 Postman 并向服务器代理发出请求,在另一种情况下,我在开发人员 运行 Postman 上向服务器代理发出请求.在 VS 中,我可以看到我在两种情况下的代码中都经历了相同的路径,并且 API 的响应是相同的。
感谢阅读,如有任何帮助,我们将不胜感激!
将此添加到 web.config:
<system.webServer>
<httpErrors existingResponse="PassThrough"></httpErrors>
</system.webServer>
在这里找到了解决方案: In IIS7.5 what module removes the body of a 400 Bad Request