使用 SOAP Web 服务时出现奇怪的错误

本文关键字:错误 SOAP Web 服务 使用 | 更新日期: 2023-09-27 18:36:47

对于一个学校项目,我必须创建一个Java服务器,该服务器能够为具有对WSDL的服务引用的.NET客户端提供服务。我有 .NET 客户端代码:

        using (var client = new MathServiceWSDLClient())
        {
            Console.WriteLine("Multiplying " + Num1 + " and " + Num2 + ": " + client.Multiply(Num1, Num2));
            Console.WriteLine("Adding" + Num1 + " and " + Num2 + ": " + client.Add(Num1, Num2));
        }

我还编写了Java服务器:

Scanner sc = new Scanner(socket.getInputStream());
boolean clientExpectContinue = false;
            int contentLength = -1;
            String line;
            while (!(line = sc.nextLine()).isEmpty()) {
                System.out.println(line);
                if (line.startsWith("Content-Length")) {
                    String[] elements = line.split(": ");
                    contentLength = Integer.parseInt(elements[1]);
                } else if (line.startsWith("Expect")) {
                    clientExpectContinue = true;
                }
            }
            int notEmpties = 0;
            byte[] soapEnvelopeData = new byte[contentLength];
            char[] soapChars = new char[contentLength];
            for (int i = 0; i < contentLength; i++) {
                soapChars[i] = (char) socket.getInputStream().read();
                if (i == 0)
                    System.out.println("DFSDFSDf");
            }
            // System.out.println(socket.getInputStream().read(soapEnvelopeData));
            System.out.println(soapEnvelopeData.length);
            File file = new File("tempEnvelope.txt");
            FileOutputStream fileOut = new FileOutputStream(file);
            // fileOut.write(soapEnvelopeData);
            System.out.println("Content!");
            System.out.println(new String(soapChars));
            fileOut.write(new String(soapChars).getBytes());
            fileOut.flush();
            fileOut.close();
            /* Some fancy SOAP and Reflection stuff that works */

服务器的要点如下: 它获取传入请求,读取标头并查找内容长度。它解析并保存此内容。从这里有两个版本。第一个构造一个与内容长度大小相同的字节数组,并将该数组作为参数传递到 socket.getInputStream().read() 方法中。第二个构造一个内容长度相同的 char 数组,然后从流中读取单个字节并将它们强制转换为 char。

如图所示,当我尝试在一次执行中运行具有多个请求的 .NET 客户端时,问题就会发挥作用。第一个请求没有任何明显的问题。当第二个进入时,服务器读取标头,获取内容长度并构造数组。但是,当需要从套接字读取时,程序只是等待。使用 char 数组方法,我能够了解到它在读取第一个值时等待。一分钟过期后,.NET 将超时,程序的其余部分将中断。

但是,如果我让服务器保持运行状态,并且每次执行 .NET 客户端只有一个请求,则一切正常;响应会按原样返回。

我已经尝试了一些解决方案:

  • 为每个请求创建一个新的 MathServiceWSDLClient
  • 将每个请求放在自己的 using() 块中。
  • 一次执行两个相同的请求:两个 Multiply() 或 Add() 请求。

任何帮助,不胜感激。提前谢谢大家。~雷诺·扬斯·范·伦斯堡

使用 SOAP Web 服务时出现奇怪的错误

.net 可能会为后续请求保持套接字打开状态。类似服务器的 Java 代码中可能存在与此相关的错误。

您是否能够将框架用于 Java 服务器代码?我强烈推荐这个,并毫不犹豫地推荐 rmbedded Jetty。这意味着您不必在Java中的套接字级别工作 - 您可以让Jetty处理所有这些复杂性。