0

我创建了一个ASP.NET MVC4 Web API服务(REST)与单个GET操作。该动作当前需要11个输入值,因此我不是将所有这些值传递到URL中,而是选择将这些值封装到一个类类型中,并将其作为Content-Body传递。当我在Fiddler中测试时,我将动词指定为GET,并在“请求正文”输入框中输入JSON文本。这很好用!ProtocolViolationException负载测试Web服务(与内容体的GET操作)

问题是当我尝试在Visual Studio 2010 Ultimate中执行负载测试时。我能够指定GET操作和JSON Content-Body就好了。但是,当我运行Load测试时,VS会报告测试结果中的类型为ProtocolViolationException的异常(无法使用此谓词类型发送内容主体)。该测试在1ms内执行,因此我怀疑这些例外会导致测试立即中止。我能做些什么来避免这些例外情况?我宁愿不改变我的API来使用URL参数来解决测试工具。如果我因其他原因更改API,请告诉我。谢谢!

+0

更好地避免使用GET的内容。你为什么需要它?你可以使用'POST'动词。在现实世界中,'GET'不应该需要11个输入。 – Aliostad 2012-07-20 09:16:16

+0

@Aliostad,我没有写任何东西到服务器。我只是根据输入条件查询。 GET似乎是正确的。我正在构建真正需要11个以上输入值的真实世界服务。 ASP.NET Web API支持它就好了。除了我遇到的工具问题之外,选择POST的_concrete_原因是什么?任何后果?谢谢! – 2012-07-20 17:05:09

回答

0

我发现放这个答案比较容易,而不是进行讨论。

发送内容GET未在RFC 2616中定义,但尚未禁止。所以就规范而言,我们处于一个我们必须作出判断的领域。

GET是正则用于得到资源。所以你正在使用这个动词和你正在发送的参数来检索这个资源。由于GET既安全又幂等,因此非常适合缓存。缓存通常基于资源URI进行 - 有时基于不同的头文件。关键是缓存实现 - AFAIK - 不会使用GET内容(说实话,我还没有看到任何GET与真实世界的内容)。将内容包含在密钥生成中是没有意义的,因为它会降低高速缓存的可伸缩性。

如果您有要发送的参数,它们必须位于URI中,因为这是定义该URI的一部分。 因此,我坚信用GET发送内容是错误的

即使您查看诸如OData的实现,他们也会将条件放入URI中。我无法想象您的(或任何)应用程序要求超出OData查询要求。

+0

已售出。感谢你的回答。 – 2012-07-23 16:48:08

+0

Aliostad JSONP呢?我的客户端在客户端浏览器上使用JavaScript进行调用,因此它需要使用仅通过GET提供的JSONP ...。所以我不得不支持GET。除非有我失踪的替代解决方案。 (我的API在过去的几个月里使用JSONP和GET工作,没有问题。) – 2013-02-19 20:42:47

+0

@LeeGrissom JSONP不一定是宁静的。此外,浏览器无法使用GET发送内容,因此您必须使用该URL发送查询字符串参数。 – Aliostad 2013-02-20 10:51:29