【问题标题】:strange behavior of WebAPI - responds differently when called from different machinesWebAPI 的奇怪行为 - 从不同机器调用时响应不同
【发布时间】:2024-05-29 21:05:02
【问题描述】:

我在服务器上部署了一个 WebAPI 服务。还有一个用于测试 API 的 MVC 应用程序。一个这样的测试器在我的开发机器上运行,另一个副本(相同版本)在 API 所在的服务器上运行。

MVC 测试器应用支持直接调用 API,也支持通过内置的“代理”(http 处理程序)绕过“Access-Control-Allow-Origin”错误。例如,如果我在我的开发机器上运行测试应用程序并且我想从服务器接收数据,我必须使用代理。此设置运行良好,所有调用都通过并且数据正确传递。

当我没有提供足够的输入(用于测试目的)并且 API 生成“400 Bad request”错误时,就会出现问题。只有当我从我的开发机器向远程机器进行调用时才会发生这种情况,并且如果我在服务器上进行相同的调用,它就可以正常工作。

我在远程服务器上用 Postman 进行了测试:

直接发布到 API:POST 到 177.77.77.77/v1/feature {JSON 有效负载}

我得到的响应包含正确的标头,一个带有描述错误的 JSON 对象的正文。当我通过服务器的代理发送相同的命令时,也会发生同样的事情:

通过代理发布:POST 到 177.77.77.77/proxy/feature {JSON 有效负载}

两个结果是相同的,这是预期的行为,我认为可以得出代理正在运行且 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"}

这是具有预期消息正文 (JSON) 和正确内容长度的正确行为。如果我向服务器的代理发出请求,我的请求变为:

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

响应的正文/有效负载丢失或被状态替换,内容类型从 JSON 更改为 text/html,缓存控制变为私有。

非工作情况下的 cookie 不起作用。我尝试删除它,结果仍然是错误的。

您认为为什么会发生这种情况?我该如何解决这个问题并找到代码的哪一部分(或者可能是 IIS 设置?)负责为看似相同的请求发送不同的响应?毕竟,当我仅在 dev 或仅在远程上运行时,一切正常。这可能是服务器上的 IIS 中的某些权限问题或某些问题吗?

我尝试远程调试代理代码,在通过 Postman 发送 Post 命令(具有相同的有效负载)的同时,我会单步调试代码。在一种情况下,我在服务器上运行 Postman 并向服务器的代理发出请求,在另一种情况下,我在 dev 上运行 Postman 并向服务器的代理发出请求。在 VS 中,我可以看到我在两种场景的代码中都经历了相同的路径,并且 API 的响应是相同的。

感谢您的阅读,任何帮助的尝试将不胜感激!

【问题讨论】:

    标签: asp.net-mvc rest iis asp.net-web-api


    【解决方案1】:

    将此添加到 web.config:

    <system.webServer>
        <httpErrors existingResponse="PassThrough"></httpErrors>
    </system.webServer>
    

    在这里找到了解决方案: In IIS7.5 what module removes the body of a 400 Bad Request

    【讨论】:

      最近更新 更多