如果我有一个客户端应用程序一个接一个地向我的Web服务发送请求,那么Web服务是否能够处理每个请求而不是因为新的请求而覆盖先前的请求?我希望处理所有请求而不是替换另一个请求。我是否可以使用来自同一客户端的多个请求来执行此操作
答案 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中没有任何假设。它应该知道完成工作所需的一切,因为它将是无状态的,因此,它指的是没有可以改变的全局变量,只有const
和static
个变量。
StaticAnswers类是静态的,只是存储答案,查找为ipaddress,以提高速度。
它将以适当的数组返回答案。
当您发送完最后一个问题后,只需致电GetAnswers
,直到您取回所有内容为止。您可能需要在客户端跟踪已发送的数量以及已收到的数量。
这不是理想的,并且是一个非常粗略的草图,但希望它会给你一些工作。