通过vpn连接的网络,访问webservice地址时报504错误

问题遇到的现象和发生背景

现在有台中转电脑,通过vpn可以访问内网,现在开发一个程序部署到该中转电脑上,访问webservice服务,不管是用Java还是用net都报504错误

问题相关代码,请勿粘贴截图
package com.jytj.service;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.File;
import java.io.IOException;
import org.dom4j.Document;
import com.xmlfile.*;

public class TestClient1 {
    public static void main(String[] args) throws Exception {
        String url = "http://127.0.0.1:8080/jytjRPCService/services/LisBaseService?wsdl";

        String namespace = "http://service.jytj.com";// 此处的命名空间 example
                                                        // 应与发布的服务中的命名空间保持一致.
        String operateName = "execute";
//        String operateName = "ws_execute";
        /**
         * 
         * uploadSampleType.xml 标本类型上传 getSampleType 标本类型下载 uploadKdxmTest
         * 开单项目上传 getHyxm 开单项目下载 uploadLabTest 检验报告项目上传 getJyxm 检验报告项目下载
         * uploadBioDict 细菌字典上传 uploadAntiDict 药敏字典上传 getDoctAdvise条码获取
         * submitReportBat检验报告单上传 cancelCheckFeedback取消审核反馈
         * receiveSampleFeedback标本接受反馈 sendSampleWarn危急值发布告知
         * sendSampleNoreport未及时报告告知 receiveReportFeedback报告已阅读反馈
         * getDeliveryList标本交接单查询 uploadPdfReport pdf文件上传
         * */
        String str1 = "";
        try {
            String configPath = TestClient1.class.getClassLoader()
                    .getResource("com/xmlfile/submitReportBat.xml").getFile();
            configPath = java.net.URLDecoder.decode(configPath, "utf-8");
            File file = new File(configPath);
            Document doc = XMLHelper.getDocument(file);
            str1 = doc.asXML();
            String[] param = new String[] { str1 };
            Axis2CommonClient axClient = new Axis2CommonClient();

            Object obj = axClient.excute(url, namespace, operateName, param);

            System.out.println(obj);

        } catch (Exception e) {

            e.printStackTrace();
        }
    }
}

package com.jytj.service;

import java.util.Iterator;



import javax.xml.namespace.QName;

 

import org.apache.axiom.om.OMElement;

import org.apache.axis2.addressing.EndpointReference;

import org.apache.axis2.client.Options;

import org.apache.axis2.rpc.client.RPCServiceClient;


public class Axis2CommonClient {
    public Axis2CommonClient() {


    }

     

    /**

    * 

    * @param srvcUrl

    *            访问的url

    * @param namespace

    *            命名空间

    * @param operateName

    *            你想调用的方法

    * @param param

    *            要传入的参数。

    * @return

    * @throws Exception

    */

    public Object excute(String srvcUrl, String namespace, String operateName,
    Object param[]) throws Exception {
        //namespce : http://com operateName :方法名
    QName qname = new QName(namespace, operateName);
    RPCServiceClient client = new RPCServiceClient();
    Options options = new Options();
    options.setTo(new EndpointReference(srvcUrl));
    options.setAction("urn:" + operateName);
    client.setOptions(options);
    OMElement element = client.invokeBlocking(qname, param);
    if (element != null && !"".equals(element)) {
    Iterator<?> values = element.getChildrenWithName(new QName(
    namespace, "return"));
    while (values.hasNext()) {
    OMElement omElement = (OMElement) values.next();
    return omElement.getText();
    }
    } else {
    return element;
    }
    return "-1";

    }
}


运行结果及报错内容

img

追加说明:
用soapui访问,也是报错,其实底层报的也是504错误

img

二、用net语言开发也是不行,

img


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApplication2.WebReference;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                dispSoap();
            }
            catch (Exception ex)
            {

                this.textBox1.Text = ex.Message +  ex.StackTrace;
            }
        }

        private string dispSoap()
        {

            WebReference.LisBaseService service = new LisBaseService();
            string request = " <request action=\"submitReportBat\" client=\"生物\">"
                + "< body >" + "< datainfo >" +
    "< jgid > 4 </ jgid >" +
    "< sampleno > 200040009763 </ sampleno > " +
    "< doctadviseno > 200040009763 </ doctadviseno >" +
    "< receivetime > 2022 - 01 - 06 17:44:23 </ receivetime >" +
           "< receivername > 李 </ receivername >" +
           "< patientid > 045087195 </ patientid >" +
          " < patientname > 郑 </ patientname >" +
           "< sex > 1 </ sex >" +
          " < checkername > 李 </ checkername >" +
          " < checker2name > 彭 </ checker2name >" +
          " < checktime > 2022 - 01 - 07 11:30:29 </ checktime >" +
          "        < resultinfo >" +
              "        < testid > 1127 </ testid >" +
               "       < chinesename ></ chinesename >" +
                "      < wstestid > 1128 </ wstestid >" +
                 "     < wschinesename ></ wschinesename >" +
                  "    < testresult > 43.39 </ testresult >" +
                   "   < ckfw ></ ckfw >" +
                    "  < reflo ></ reflo >" +
                     " < refhi ></ refhi >" +
                      "< hint ></ hint >" +
                "      < unit ></ unit >" +
                "  </resultinfo >" +
                 " < PDFLIST >" +
                "      < PDFORDER > 1 </PDFORDER >" +
                 "     < PDF ></ PDF >" +
                 "     < PAGE > 2 </ PAGE >" +
                 " </ PDFLIST >" +
              "</datainfo >" +
                "         </body >" +
                 "      </request > ";
            service.Timeout = -1;

            textBox1.Text = service.UserAgent;
            textBox1.Text += service.Url;
            textBox1.Text += service.SoapVersion;
            textBox1.Text += service.Proxy;
            textBox1.Text += service.ClientCertificates;

           //service.executeAsync(request);
            string result = service.execute(request);

            //textBox1.Text = result;
           
            return "";
        }

        private void button1_Click(object sender, EventArgs e)
        {

            WebReference.LisBaseService service = new LisBaseService();
            service.Timeout = -1;
            object obj = service.getPatientinfo("045087195");
            textBox1.Text = obj.ToString();
        }
    }
}

504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。超时了没收到请求。
这个问题估计是由后端电脑之间 IP 通讯缓慢而产生,可能包括您的 Web 服务器。如果您的 Web 服务器由某网站托管,需要找相关人员解决。一般来说,是由于被请求服务器发送超时引起。

应该是代理导致网站不可用的缘故

尝试更改超时响应时间ExecutionTimeout 属性值

先telnet一下这个ip和端口,看看网络是不是通的

webservice的网关与中转电脑网络不通

你用网关ping一下中转电脑

在出入站规则里面把端口放开

建议你还是把程序放在服务器上运行

    String url = "http://127.0.0.1:8080/jytjRPCService/services/LisBaseService?wsdl";

你这访问的是中转机本机的webservice的,并不是vpn指定的服务器啊!应该还是你的url设置的问题,导致访问不了目标服务器。

  1. 在中转电脑部署一个数据库,中转电脑程序直接连本地数据库,看会不会报错。
  2. 在webservice服务电脑上和中转电脑上分别安装一个wireshark网络监控软件,看报504错误时,有什么网络数据交互。

现在的网络架构是这样的,我这边的数据库是在外网,对方的网络是内网。然后对方开放了一个中转电脑。中转电脑和内网之间是用VPN连接。然后webservice是部署在内网里面的。现在郁闷的是有个第三方也是访问这个webservice,并且也是部署在这个中转电脑上。这个第三方开发的程序是个桌面程序,开发语言未知,可能是powerbuild。这个第三方的程序可以正常访问。

你这架构。。。504 网关超时:服务器作为网关或代理,但是没有及时从上游服务器收到请求。
好奇你这架构,WEB服务是不是要访问你的数据库,那第三方程序访问的东西如果不涉及数据库相关的,就肯定可以正常访问。
先从中转电脑排查两端的连通性,怀疑服务请求没发到去数据库,

手动在Web.config里增加上88端口

中转电脑是什么操作?有150提问,都可以买一年低配的服务器了哈哈

我觉得你这个是网络问题,应该是网关设置问题。
打个比方,电信猫入户,我先接入到一个路由器上,然后我又想从这个路由器接到另一个路由器上,那么第一个路由器我可以做桥接,网关为192.168.0.1,接入第二个路由器时,网关就是第一个路由器的IP。

会不会是端口被请求那边的防火墙给ban了

别用vpn,用端口映射

img

可能是另外的那个主机一直占用着端口

估计是端口问题

出现了504,那么原因肯定就是访问不了服务所导致!


其实,解决方案可以有这么一个,
1.路由设置
2.用代理服务器中间件处理