赞
踩
本例开发工具用的是Visual Studio 2022,代码实现以下功能
打开工具,文件-新建-项目,如图
在弹出的创建新项目界面,选择ASP.NET Web应用程序(.NET Framework),点击下一步如图
进入新项目配置方案,填写好项目名称、选择项目位置以及所使用的框架,这里我用的是“.NET Framework 4.6.2”框架,然后点击创建,如下图。本例项目名称为WebServicePass
打开解决方案资源管理器-在刚创建的web项目上右键-添加-新建项,如图
在弹出添加新项框中选择Web目录下的web 服务(AMSX),名字自己命名,点击添加,本例命名为如下图。ForNisServices.asmx
类创建出来默认是HelloWorld方法,自己可以添加几个方法。也可以删掉HelloWorld方法,本例我建了7个方法,并且把默认的HelloWorld方法删掉了。
可通过该类的post方法,请求其他HTTP接口,Get方法也支持,本文以post为例,打开解决方案资源管理器-在刚创建的web项目上右键-添加-新建项-C#-类,类名是HttpWebPostAndGet,然后创建一个HttpPost(string url, string param = "")方法,url入参是请求接口地址,param入参是请求报文,代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.IO;
- using System.Net;
- using System.Text;
-
- namespace WebServicePass
- {
- public class HttpWebPostAndGet
- {
- #region Post
- /// <summary>
- /// 发起一个HTTP请求(以POST方式)
- /// </summary>
- /// <param name="url"></param>
- /// <param name="param"></param>
- /// <returns></returns>
- public static string HttpPost(string url, string param = "")
- {
- HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
- request.Method = "POST";
- request.ContentType = "text/xml";
- request.Accept = "*/*";
- request.Timeout = 100000;//响应超时设置
- request.AllowAutoRedirect = false;
- StreamWriter requestStream = null;
- WebResponse response = null;
- string responseStr = null;
- try
- {
- requestStream = new StreamWriter(request.GetRequestStream());
- requestStream.Write(param);
- requestStream.Close();
- response = request.GetResponse();
- if (response != null)
- {
- StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
- responseStr = reader.ReadToEnd();
- reader.Close();
- }
- }
- catch (Exception)
- {
- throw;
- }
- finally
- {
- request = null;
- requestStream = null;
- response = null;
- }
- return responseStr;
- }
- }
- }
- #endregion
Webservice里的方法,都是需要查询数据库里的数据集记录,所以需要一个访问oracle的类ClassOracle,打开解决方案资源管理器-在刚创建的web项目上右键-添加-新建项-C#-类,代码如下:
- public class ClassOracle
- {
- //连接数据库的信息,通过读取配置文件中AppSettings里connectionString节点配置
- //private static string db = "自己的数据库信息";
- private static readonly string conn_Str = ConfigurationManager.AppSettings["connectionString"];
- //链接数据库
- private static OracleConnection conn_Oracle = new OracleConnection(conn_Str);
- //查询oracle数据库内容返回数据集
- public DataTable oracleTable(string ora)
- {
- //链接数据库
- // OracleConnection con = new OracleConnection(db);
- //把数据放入数据集
- DataTable dt = new DataTable();
- try
- {
- //连接数据库
- conn_Oracle.Open();
- //查询数据
- OracleDataAdapter da = new OracleDataAdapter(ora, conn_Oracle);
- //查询数据放入数据集里
- da.Fill(dt);
- }
- catch (Exception ex)
- {
- //失败出现异常,原因在ex.message里。
- throw new Exception(ex.Message);
- }
- finally
- {
- //断开数据库
- conn_Oracle.Close();
- }
- //把数据集返回出去
- return dt;
- }
- }
打开解决方案资源管理器-在刚创建的web项目上右键-添加-新建项-C#-类,创建写日志类Log,可以将日志输出为txt文件,路径是在项目基目录下创建一个Log文件夹,路径代码段:string folder = AppDomain.CurrentDomain.BaseDirectory + "Log"。日志文件命名是日期+上.log后缀,代码段:string file = "Log" + date + ".log"。路径和命名可以根据自己喜好设置,日志类我也是网上参考博主的,博文地址已忘记,如作者看到,请跟帖,我注明,全部日志类代码我放附件了,这里不赘述。日志文件夹下的文件生成如图:
日志内容如下:
- - 2024-04-05 00:59:26.67288 - - - - - - - - - - --
WebServicePass.ForNisServices.Post() 方法被执行。-
记录消息:
接口推送出错:-
错误异常:
远程服务器返回错误: (500) 内部服务器错误。-
错误信息:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:for="http://www.herenIT.com/ForNisServices">
<soapenv:Header/>
<soapenv:Body>
<for:ZyDisease>
<!--Optional:-->
<for:hiscode>?</for:hiscode>
<!--Optional:-->
<for:patientid>2****8</for:patientid>
<!--Optional:-->
<for:visitid>1</for:visitid>
</for:ZyDisease>
</soapenv:Body>
</soapenv:Envelope>
接口地址http://IP:PORT/ ZyDisease/ForNisServices?wsdl
-- - - - - - - - - - - - - - - - - - - - - - - - - -
无入参方法写在web类中,打开创建的web类,新建无入参的科室字典方法DictDept(),代码如下:
- [WebMethod(Description = "科室字典")]
- public string DictDept()
- {
- string ptPostParam = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:for=\"http://www.herenIT.com/ForNisServices\">\r\n\t<soapenv:Header/>\r\n\t<soapenv:Body>\r\n\t\t<for:DictDept/>\r\n\t</soapenv:Body>\r\n</soapenv:Envelope>";//推送B接口的入参
- string ptPostUrl = ConfigurationManager.AppSettings["dictDepturl"];//配置文件中dictDepturl节点的配置,B接口的接口地址
- string strSql = "select '0' \"hiscode\",\r\na.fdeptcode \"deptcode\",\r\na.fdeptname \"deptname\",\r\na.fdeptclass \"parentname\",\r\n'1' \"is_clinic\",\r\n'0' \"is_inhosp\",\r\n'0' \"is_emergency\"\r\n from dept_table a\r\n where a.fisavailable='Y'";//查询科室字典的SQL语句
- //调用Post方法,当第三方程序调用DictDept()接口时,同步推送信息至B接口。
- Post(ptPostParam, ptPostUrl);
- //下面try一段中是 DictDept()接口的逻辑
- try
- {
- ClassOracle classOracle = new ClassOracle();//classOracle是一个访问oracle数据的方法对象
- DataTable dt = new DataTable();
- dt = classOracle.oracleTable(strSql);
- string xml = DataTable2Xml(dt);// DataTable2Xml方法将oracle数据库中查询出的结果集xml
- return xml;
- }
- //异常日志处理,异常信息写入到了一个txt文档中。Txt文档的路径在Log方法中。
- catch (Exception ex)
- { // 记录错误
- Log.WriteLog("DictDept方法执行出错:", ex.Message, strSql, ptPostParam);
- throw;
- }
- }
带入参方法写在web类中,打开创建的web类,新建带入参的方法MzDisease(),有三个入参hiscode、patientid、clinicno,都是String类型的,其他代码基本和无入参方法代码相同,代码如下:
- [WebMethod(Description = "门诊病人疾病信息")]
- public string MzDisease(String hiscode, String patientid, String clinicno)
- {
- string ptPostUrl = ConfigurationManager.AppSettings["mzDiseaseurl"];
- string ptPostParam = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:for=\"http://www.herenIT.com/ForNisServices\">\r\n <soapenv:Header/>\r\n <soapenv:Body>\r\n <for:MzDisease>\r\n <!--Optional:-->\r\n <for:hiscode>?</for:hiscode>\r\n <!--Optional:-->\r\n <for:patientid>" + patientid + "</for:patientid>\r\n <!--Optional:-->\r\n <for:clinicno>" + clinicno + "</for:clinicno>\r\n </for:MzDisease>\r\n </soapenv:Body>\r\n</soapenv:Envelope>";
- string strSql = "select distinct '0' \"hiscode\",\r\n b.visit_no \"patientid\",\r\n b.visit_no \"clinicno\",\r\n null \"prescno\",\r\n a.dicdno \"discode\",\r\n a.ddesc \"disname\",\r\n decode(a.DRANK, 1, 1, 0) \"is_main\",\r\n to_char(a.DMDATE,'yyyy-mm-dd hh24:mi:ss') \"startdate\",\r\n to_char(a.DMDATE,'yyyy-mm-dd hh24:mi:ss') \"enddate\",\r\n a.Dtypeno \"distype\",\r\n to_char(a.DMDATE,'yyyy-mm-dd hh24:mi:ss') \"diagnose_datetime\",\r\n a.drank \"sortid\",\r\n to_char(a.DMDATE,'yyyy-mm-dd hh24:mi:ss') \"recordtime\",\r\n a.DDESC \"diag_explanation\",\r\n decode(a.Ddigkind, '0', '1', '1', '0', '9', '-1') \"isconfirmed\",\r\n a.Ddtrno \"doctorcode\"\r\n from mzsf.mzys_tbs_diag a\r\n inner join op.op_visit b\r\n on a.dregno = b.visit_id\r\n inner join mzsf.mzys_tbs_mpresp c\r\n on c.lshno = b.visit_no\r\n where a.Ddate > sysdate - 55\r\n and b.ssysdate > sysdate - 55\r\n and b.visit_no='" + patientid + "'\r\n and b.visit_no='" + clinicno + "'";
- 调用Post方法,当第三方程序调用DictDept()接口时,同步推送信息至B接口。
- Post(ptPostParam, ptPostUrl);
- try
- {
- ClassOracle classOracle = new ClassOracle();
- DataTable dt = new DataTable();
- dt = classOracle.oracleTable(strSql);
- string xml = DataTable2Xml(dt);
- return xml;
- }
- catch (Exception ex)
- {
- Log.WriteLog("MzDisease方法执行出错:", ex.Message, strSql, ptPostParam);
- throw;
- }
- }
Post方法推送信息至B接口、C接口。方法写在web类中。打开创建的web类,新建post方法,代码如下:
- public static void Post(String ptPostParam, String ptPostUrl)
- {
- try
- {
- HttpWebPostAndGet HttpWebPostAndGet = new HttpWebPostAndGet();
- string responseStr = HttpWebPostAndGet.HttpPost(ptPostUrl, ptPostParam);
- }
- catch (Exception ex)
- {
- Log.WriteLog("接口推送出错:", ex.Message, ptPostParam + "\r\n接口地址" + ptPostUrl);
- }
- }
创建一个DataTable2Xml方法来实现,将Oracle数据库检索出来的结果集,转换成xml,方法写在web类中,代码如下:
- public static string DataTable2Xml(DataTable table)
- {
- if (null == table) return string.Empty;
- if (string.IsNullOrEmpty(table.TableName))
- {
- table.TableName = "Row";
- }
- StringWriter writer = new StringWriter();
- table.WriteXml(writer);
- string xmlStr = writer.ToString().Replace("<DocumentElement>", "").Replace("</DocumentElement>", "");//转换出的xml里自动添加了DocumentElement根节点,上网找了好多方法都没法修改,只好用Replace函数替换掉。
- writer.Close();
- return "<MESSAGE><ReturnCode>" + table.Rows.Count + "</ReturnCode><ErrorMessage>查询成功</ErrorMessage><Data><Rows>" + xmlStr + "</Rows></Data></MESSAGE>";//组装成所需xml格式
- }
本例中的oracle数据库连接信息,请求HTTP接口地址等均在Web.config文件中配置。
Oracle数据库连接信息配置如下:
<oracle.manageddataaccess.client>
<version number="*">
<dataSources>
<dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=IP)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME= Example))) "/>
</dataSources>
</version>
</oracle.manageddataaccess.client>
请求HTTP接口地址配置如下:
<appSettings>
<add key="connectionString" value="Data Source=SampleDataSource;User ID=mp;Password=mp;Persist Security Info=True"/>
<add key="dictDepturl" value="http://ip:port/DictDept/ForNisServices?wsdl"/>
<add key="mzDiseaseurl" value=" http://ip:port/MzDisease/ForNisServices?wsdl"/>
</appSettings>
在解决方案资源管理器-创建的web项目上右键-设为启动项目-点击工具栏小三角在本地浏览器运行IIS,如图:
本例用的是360浏览器,会自动在本地打开服务的目录(有些机器可能要需要百度下设置目录打开权限,这里不赘述)在打开的目录点击ForNisServices.asmx(本例的web类)。如下图:
进入到接口方法调用界面,鼠标点击对应方法名调用方法,带入参的方法需要在对应入参输入,如下图:
点击无入参方法DictDept-点击调用,得到接口返回
点击调用之后的界面显示的是DictDept方法返回的数据,内容啥的别在意哈,如图:
点击带入参方法MzDisease,在参数列表值列填入参数,点击调用,得到接口返回数据。如下图:
另外:除了可以用本地浏览器测试接口,也可以在点击三角符号之后,用SoapUI等一些webservice调试工具测试接口。本例不赘述。
Webservice服务测试通过之后,需要将项目打包部署到生产库服务器上,步骤是:打开解决方案资源管理器-在创建的web项目上右键-发布,设置发布的路径,如图
本例路径是E:\source\publish\WebServicePass,Vs2022会在该路径下生成对应的程序文件夹,将文件夹拷贝到生产库服务器上,然后配置IIS,启动服务。
打开IIS管理器,在网站选项右键-添加网站,如图
在弹出添加网站界面,网站名称填入名称,物理路径选择上一步打包项目拷贝所在的生产环境文件夹路径,本例是D:\WebServicePass,设置IP和端口,注意端口不要与其他在用端口冲突,最后点击确定。如下图:
点击刚才添加的网站-双击目录浏览-弹出界面点击启用,如下图
点击刚才添加的网站-双击日志-弹出界面点击启用,如下图
设置完,点击启动,点击浏览网站下的网址,在浏览器即可看到webservice接口的方法。调用方式和webservice接口本地调试操作一致,也可以用SoapUI等工具调试,这里不赘述。如下图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。