Web服务和来自同一客户端的多个请求

时间:2009-10-28 23:17:05

标签: service

如果我有一个客户端应用程序一个接一个地向我的Web服务发送请求,那么Web服务是否能够处理每个请求而不是因为新的请求而覆盖先前的请求?我希望处理所有请求而不是替换另一个请求。我是否可以使用来自同一客户端的多个请求来执行此操作

2 个答案:

答案 0 :(得分:7)

我不知道为什么另一个答案是如此长,以至于基本上是一个关于基础知识的简单问题,但答案是

除非您专门为服务器编写某种交叉(例如,每个请求使用的静态跨线程列表或更复杂的结构),否则每个请求都独立于其他请求。

如果使用通过事件提供结果的异步模式,在客户端遇到交叉会更容易 - 您需要确保将结果输出到正确的请求(通常通过提供一些令牌作为“自定义状态”来完成“变量,您可以使用它来确定响应处理程序中的原始请求。”

答案 1 :(得分:1)

答案取决于您的架构。

例如,如果服务器是多线程的,并且业务逻辑部分是无状态的,那么在服务器上请求将不会覆盖,因为每个线程将调用一个函数并返回结果。

在客户端,最好的办法是让每个请求从不同的线程发送,以便该线程阻塞直到它得到响应,然后处理就可以了。

如果你有不同的设计,请描述一下。

更新:根据新信息,您可能需要查看以下信息: http://weblogs.java.net/blog/2006/02/01/can-i-call-you-back-asynchronous-web-services

我很好奇您是否或者是否正在进行异步Web服务调用。一般来说,webservices似乎阻止了,但是如果你这么快就进行这些调用,那么我只能假设异步性。

因此,Web服务可以在服务器端存储答案,因此有一个有状态的类,通过IP地址将结果存储在字典中。然后客户端轮询答案,因此,理想情况下,如果您发送请求,您应该能够取回一系列答案作为回复。如果您已发送所有请求并仍在等待更多响应,则轮询。您应该能够再次获得一系列答案,以减少浪费的带宽。

更好的方法是让您的客户端也成为服务器,以便您发送请求,并使用IP地址:端口进行回调,这样服务器就会对客户端做出单向响应。但是,这更复杂,但它减少了浪费带宽。

更新2:这是在不检查的情况下完成的,因此可能存在错误:

@WebMethod
public ResponseModel[] AnswerQuestion(QuestionModel[] question) {
// Get the IP address of the client
  AnswerController ac = new AnswerController(question, ipaddress);
  return mypackage.myclass.StaticAnswers.GetAnswers(ipaddress);
  // return an array
}

@WebMethod
public ResponseModel[] GetAnswers() {
   return mypackage.myclass.StaticAnswers.GetAnswers(ipaddress);
}

好的,这应该给出一个粗略的想法。

AnswerController中没有任何假设。它应该知道完成工作所需的一切,因为它将是无状态的,因此,它指的是没有可以改变的全局变量,只有conststatic个变量。

StaticAnswers类是静态的,只是存储答案,查找为ipaddress,以提高速度。

它将以适当的数组返回答案。

当您发送完最后一个问题后,只需致电GetAnswers,直到您取回所有内容为止。您可能需要在客户端跟踪已发送的数量以及已收到的数量。

这不是理想的,并且是一个非常粗略的草图,但希望它会给你一些工作。