我在服务器上部署了一个WebAPI服务。还有一个用于测试API的MVC应用程序。一个这样的测试器在我的开发机器上运行,另一个副本(相同的版本)在API所在的服务器上运行。
MVC测试版应用程序支持直接调用API,也支持通过内置的代理服务器调用API。 (http处理程序)绕过" Access-Control-Allow-Origin"错误。因此,例如,如果我在我的开发机器上运行测试器应用程序并且我想从服务器接收数据,我必须使用代理。这个设置很好地工作,所有的调用都经过,数据正确传递。
当我没有提供足够的输入(用于测试目的)并且API生成" 400错误请求时,会出现问题"错误。它只发生在我从我的开发机器拨打远程机器的时候,如果我在服务器上进行同样的呼叫,它就能正常工作。
我在远程服务器上使用Postman进行了测试:
直接发布到API:POST到177.77.77.77/v1/feature {JSON payload}
我得到的响应包含正确的标题,一个带有描述错误的JSON对象的主体。当我通过服务器代理发送相同的命令时,会发生同样的事情:
通过代理发布:POST到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"}
这是预期消息体(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的响应是相同的。
感谢阅读,我们将非常感谢任何帮助尝试!
答案 0 :(得分:1)
将此添加到web.config:
<system.webServer>
<httpErrors existingResponse="PassThrough"></httpErrors>
</system.webServer>
在这里找到解决方案: In IIS7.5 what module removes the body of a 400 Bad Request