现在有台中转电脑,通过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";
}
}
追加说明:
用soapui访问,也是报错,其实底层报的也是504错误
二、用net语言开发也是不行,
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设置的问题,导致访问不了目标服务器。
现在的网络架构是这样的,我这边的数据库是在外网,对方的网络是内网。然后对方开放了一个中转电脑。中转电脑和内网之间是用VPN连接。然后webservice是部署在内网里面的。现在郁闷的是有个第三方也是访问这个webservice,并且也是部署在这个中转电脑上。这个第三方开发的程序是个桌面程序,开发语言未知,可能是powerbuild。这个第三方的程序可以正常访问。
你这架构。。。504 网关超时:服务器作为网关或代理,但是没有及时从上游服务器收到请求。
好奇你这架构,WEB服务是不是要访问你的数据库,那第三方程序访问的东西如果不涉及数据库相关的,就肯定可以正常访问。
先从中转电脑排查两端的连通性,怀疑服务请求没发到去数据库,
手动在Web.config里增加上88端口
中转电脑是什么操作?有150提问,都可以买一年低配的服务器了哈哈
我觉得你这个是网络问题,应该是网关设置问题。
打个比方,电信猫入户,我先接入到一个路由器上,然后我又想从这个路由器接到另一个路由器上,那么第一个路由器我可以做桥接,网关为192.168.0.1,接入第二个路由器时,网关就是第一个路由器的IP。
会不会是端口被请求那边的防火墙给ban了
别用vpn,用端口映射
可能是另外的那个主机一直占用着端口
估计是端口问题
出现了504,那么原因肯定就是访问不了服务所导致!
其实,解决方案可以有这么一个,
1.路由设置
2.用代理服务器中间件处理