1

我使用 C# 在 VS2012 中创建了一个非常基本的 REST Web 服务。我采用的方法如下面的一个示例所示:

[OperationContract]
[WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "OpenSession/{key}/{source_userid}/{source_id}/{source_version}/{source_ip}")]
string OpenSession(string key, string source_userid, string source_id, string source_version, string source_ip);

代码运行良好,服务已启动并正在运行。我得到响应,分发令牌等。我认为将数据包装在 URL 中就可以了,因为该服务是为日志记录而构建的,所以最后,调用将是(例如):

www.service.site/service.svc/2/5/12/HELLO

(顺便说一句,如果有更好的方法可以做到这一点,同时保持 REST 服务,请告诉我)

我遇到的问题是......我如何正确测试这个?我需要为此服务模拟 1,000 次并发点击,并构建了一个自定义 C# Windows 应用程序来执行此操作,但我遇到了许多问题。

首先,我不知道如何使用 HttpWebRequest 和流读取器/写入器以可管理的格式正确发送/接收数据。我看到请求有 GET 和 PUT 方法等,但老实说,我似乎无法区分发布数据与 URL 信息的正面或反面。AFAIK 我并没有真正发布任何数据,因为我的所有数据都嵌入在 URL 请求本身中;这个对吗?

另外,我不知道将 HttpWebRequest 设置为什么“内容类型”以与我的操作合同兼容(我可以看到 JSON 的枚举,但“文本”应该是什么?)

最重要的是,HttpWebRequest 非常慢。当我直接打开服务的 URL 时(例如“http://localhost:51849/Scribe.svc”),它很快,但是第二次我尝试调用一个方法(例如“”http://localhost:51849/ Scribe.svc/GetStatus"),我得到了 1.5-2 秒的延迟(我已经完成了所有代理修复以确保它尽可能快)。

任何帮助将不胜感激。

4

3 回答 3

0

也许您应该考虑使用一些性能工具。有很多,它们应该很容易找到适合你的酒的。Jmeter 可能是一个不错的选择。

这是一个展示如何使用 Jmeter 测试 REST Web 服务的指南。

希望它可以提供帮助。

于 2012-10-29T19:20:54.310 回答
0

我不知道你是否知道这个实用程序: SoapUI

您可以使用它来引用您的服务并生成请求以测试您的服务。

安装非常简单。安装后,您必须单击文件/新建 SoapUI 项目。然后,在弹出窗口中,使用服务的 wsdl 填写“Initial WSDL/WADL:”字段,如下所示:

http://localhost:51849/Scribe.svc?wsdl

它将生成客户端以正确调用您的服务。使用soap ui,您甚至可以测试进行大量调用以强调您的服务。这是测试服务的好方法。

AFAIK 我并没有真正发布任何数据,因为我的所有数据都嵌入在 URL 请求本身中;这个对吗?

是的。这就是 GET 请求的工作方式。数据通过您的网址传递。你应该只在不改变服务器上数据状态的时候使用 GET 请求,否则你应该使用 post.

当您想在服务器上创建/更新数据时将使用的 PUT 方法。

我希望它有所帮助。

问候,罗德里戈

于 2012-10-29T19:13:23.707 回答
0

感谢您的回复!实际上,我现在的测试系统正在运行,并且可以通过数千个计时器控制的会话来猛击我的服务。解决 PUT 请求问题的关键是使用空设置:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "PUT";
req.ContentType = "application/json";
req.ContentLength = 0;

我确实看过这些工具,但对于我的特定需求,我发现编写一个自定义的计时器控制应用程序是最好的方法。

我不确定延迟是否仍然存在问题,或者甚至可能与调试状态有关。一旦我将服务发布到 Azure 并对其进行远程测试,我会更好地了解基于服务的连接是否存在任何延迟问题......

于 2012-10-30T18:52:03.843 回答