首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WebAPI的奇怪行为-当从不同的机器调用时响应不同

WebAPI的奇怪行为-当从不同的机器调用时响应不同
EN

Stack Overflow用户
提问于 2015-03-30 16:19:03
回答 1查看 282关注 0票数 1

我在服务器上部署了一个WebAPI服务。还有一个用于测试API的MVC应用程序。其中一个测试器运行在我的dev计算机上,另一个副本(相同版本)运行在API驻留的服务器上。

MVC测试应用程序支持直接调用API,也支持通过内置的'proxy‘(http处理程序)来绕过“访问控制-允许-原产地”错误。因此,例如,如果我在我的dev机器上运行测试程序,并且我想从服务器接收数据,我必须使用代理。这个设置工作得很好,所有的调用都经过,数据被正确传递。

当我没有提供足够的输入(用于测试)和API生成一个"400坏请求“错误时,就会出现问题。只有当我从开发计算机调用远程计算机,并且在服务器上进行相同的调用时,才会发生这种情况。

我在远程服务器上与邮递员进行了测试:

直接发送到API: post到177.77.77/v1/feature {JSON有效载荷}

我得到的响应包含正确的标题,一个带有描述错误的JSON对象的主体。同样的情况发生在我发送相同的命令时,但通过服务器的代理:

通过代理发布: post到177.77.77/proxy/feature {JSON有效载荷}

这两个结果是相同的,这是预期的行为,我认为它允许得出一个结论,即代理正在工作,而API正在工作。

当我回到我的dev机器并尝试相同的调用时,我直接向API投递的结果和上面一样,但是如果我使用服务器的代理,就会发生其他事情。下面是Fiddler为工作用例提供的输出(从dev机器直接到API):

代码语言:javascript
运行
复制
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}

答复:

代码语言:javascript
运行
复制
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)和正确的内容-lenght的正确行为。如果我向服务器的代理发出请求,我的请求将变成:

代码语言:javascript
运行
复制
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}

我得到的回应是:

代码语言:javascript
运行
复制
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,缓存控制变为私有。

不工作的情况下的曲奇不起作用。我试着移除它,结果仍然是错误的。

你觉得这是为什么?如何排除这些问题并找到代码的哪一部分(或者IIS设置)?是否负责为似乎相同的请求发送不同的答复?毕竟,当我只在dev上或仅在远程上运行时,一切都很好。这可能是服务器上IIS中的权限问题吗?

我试着对代理代码进行远程调试,在通过Postman发送Post命令(具有相同的有效负载)时,我将逐步执行该代码。在一个场景中,我在服务器上运行Postman,并向服务器的代理发出请求;在另一个场景中,我在dev上运行Postman,并向服务器的代理发出请求。在VS中,我可以看到,对于这两种场景,我正在经历相同的代码路径,并且API的响应是相同的。

感谢您的阅读和任何帮助,我们将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-30 18:02:20

将其添加到web.config中:

代码语言:javascript
运行
复制
<system.webServer>
    <httpErrors existingResponse="PassThrough"></httpErrors>
</system.webServer>

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29351231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档