当前位置:   article > 正文

C# 开发webservice接口、请求HTTP接口、iis发布服务_c#编写webservice接口

c#编写webservice接口

本例开发工具用的是Visual Studio 2022,代码实现以下功能

  • webservice接口服务功能;
  • 请求HTTP接口类(以下简称B接口,C接口);
  • 访问oracle数据库类;
  • 写日志类;
  • 无入参方法;
  • 带入参方法;
  • Post方法;
  • 数据集转xml方法;
  • 数据库连接信息、B接口地址、C接口地址配置文件;
  • Windows的IIS发布接口服务。

创建新项目

打开工具,文件-新建-项目,如图

在弹出的创建新项目界面,选择ASP.NET Web应用程序(.NET Framework),点击下一步如图

进入新项目配置方案,填写好项目名称、选择项目位置以及所使用的框架,这里我用的是“.NET Framework 4.6.2”框架,然后点击创建,如下图。本例项目名称为WebServicePass

创建web类

打开解决方案资源管理器-在刚创建的web项目上右键-添加-新建项,如图

在弹出添加新项框中选择Web目录下的web 服务(AMSX),名字自己命名,点击添加,本例命名为如下图。ForNisServices.asmx

类创建出来默认是HelloWorld方法,自己可以添加几个方法。也可以删掉HelloWorld方法,本例我建了7个方法,并且把默认的HelloWorld方法删掉了。

创建请求HTTP接口类

可通过该类的post方法,请求其他HTTP接口,Get方法也支持,本文以post为例,打开解决方案资源管理器-在刚创建的web项目上右键-添加-新建项-C#-类,类名是HttpWebPostAndGet,然后创建一个HttpPost(string url, string param = "")方法,url入参是请求接口地址,param入参是请求报文,代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.IO;
  6. using System.Net;
  7. using System.Text;
  8. namespace WebServicePass
  9. {
  10.     public class HttpWebPostAndGet
  11.     {
  12.         #region Post
  13.         /// <summary>
  14.         /// 发起一个HTTP请求(以POST方式)
  15.         /// </summary>
  16.         /// <param name="url"></param>
  17.         /// <param name="param"></param>
  18.         /// <returns></returns>
  19.         public static string HttpPost(string url, string param = "")
  20.         {
  21.             HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
  22.             request.Method = "POST";
  23.             request.ContentType = "text/xml";
  24.             request.Accept = "*/*";
  25.             request.Timeout = 100000;//响应超时设置
  26.             request.AllowAutoRedirect = false;
  27.             StreamWriter requestStream = null;
  28.             WebResponse response = null;
  29.             string responseStr = null;
  30.             try
  31.             {
  32.                 requestStream = new StreamWriter(request.GetRequestStream());
  33.                 requestStream.Write(param);
  34.                 requestStream.Close();
  35.                 response = request.GetResponse();
  36.                 if (response != null)
  37.                 {
  38.                     StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
  39.                     responseStr = reader.ReadToEnd();
  40.                     reader.Close();
  41.                 }
  42.             }
  43.             catch (Exception)
  44.             {
  45.                 throw;
  46.             }
  47.             finally
  48.             {
  49.                 request = null;
  50.                 requestStream = null;
  51.                 response = null;
  52.             }
  53.             return responseStr;
  54.         }
  55.     }
  56. }
  57. #endregion

创建oracle访问类

Webservice里的方法,都是需要查询数据库里的数据集记录,所以需要一个访问oracle的类ClassOracle,打开解决方案资源管理器-在刚创建的web项目上右键-添加-新建项-C#-类,代码如下:

  1. public class ClassOracle
  2. {
  3. //连接数据库的信息,通过读取配置文件中AppSettings里connectionString节点配置
  4. //private static string db = "自己的数据库信息";
  5. private static readonly string conn_Str = ConfigurationManager.AppSettings["connectionString"];
  6. //链接数据库
  7. private static OracleConnection conn_Oracle = new OracleConnection(conn_Str);
  8. //查询oracle数据库内容返回数据集
  9. public DataTable oracleTable(string ora)
  10. {
  11. //链接数据库
  12. // OracleConnection con = new OracleConnection(db);
  13. //把数据放入数据集
  14. DataTable dt = new DataTable();
  15. try
  16. {
  17. //连接数据库
  18. conn_Oracle.Open();
  19. //查询数据
  20. OracleDataAdapter da = new OracleDataAdapter(ora, conn_Oracle);
  21. //查询数据放入数据集里
  22. da.Fill(dt);
  23. }
  24. catch (Exception ex)
  25. {
  26. //失败出现异常,原因在ex.message里。
  27. throw new Exception(ex.Message);
  28. }
  29. finally
  30. {
  31. //断开数据库
  32. conn_Oracle.Close();
  33. }
  34. //把数据集返回出去
  35. return dt;
  36. }
  37. }

创建写日志类

打开解决方案资源管理器-在刚创建的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(),代码如下:

  1. [WebMethod(Description = "科室字典")]
  2. public string DictDept()
  3. {
  4. 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接口的入参
  5. string ptPostUrl = ConfigurationManager.AppSettings["dictDepturl"];//配置文件中dictDepturl节点的配置,B接口的接口地址
  6. 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语句
  7. //调用Post方法,当第三方程序调用DictDept()接口时,同步推送信息至B接口。
  8. Post(ptPostParam, ptPostUrl);
  9. //下面try一段中是 DictDept()接口的逻辑
  10. try
  11. {
  12. ClassOracle classOracle = new ClassOracle();//classOracle是一个访问oracle数据的方法对象
  13. DataTable dt = new DataTable();
  14. dt = classOracle.oracleTable(strSql);
  15. string xml = DataTable2Xml(dt);// DataTable2Xml方法将oracle数据库中查询出的结果集xml
  16. return xml;
  17. }
  18. //异常日志处理,异常信息写入到了一个txt文档中。Txt文档的路径在Log方法中。
  19. catch (Exception ex)
  20. { // 记录错误
  21. Log.WriteLog("DictDept方法执行出错:", ex.Message, strSql, ptPostParam);
  22. throw;
  23. }
  24. }

创建带入参方法

带入参方法写在web类中,打开创建的web类,新建带入参的方法MzDisease(),有三个入参hiscodepatientidclinicno,都是String类型的,其他代码基本和无入参方法代码相同,代码如下:

  1. [WebMethod(Description = "门诊病人疾病信息")]
  2. public string MzDisease(String hiscode, String patientid, String clinicno)
  3. {
  4. string ptPostUrl = ConfigurationManager.AppSettings["mzDiseaseurl"];
  5. 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>";
  6. 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 + "'";
  7. 调用Post方法,当第三方程序调用DictDept()接口时,同步推送信息至B接口。
  8. Post(ptPostParam, ptPostUrl);
  9. try
  10. {
  11. ClassOracle classOracle = new ClassOracle();
  12. DataTable dt = new DataTable();
  13. dt = classOracle.oracleTable(strSql);
  14. string xml = DataTable2Xml(dt);
  15. return xml;
  16. }
  17. catch (Exception ex)
  18. {
  19. Log.WriteLog("MzDisease方法执行出错:", ex.Message, strSql, ptPostParam);
  20. throw;
  21. }
  22. }

创建Post方法

Post方法推送信息至B接口、C接口。方法写在web类中。打开创建的web类,新建post方法,代码如下:

  1. public static void Post(String ptPostParam, String ptPostUrl)
  2. {
  3. try
  4. {
  5. HttpWebPostAndGet HttpWebPostAndGet = new HttpWebPostAndGet();
  6. string responseStr = HttpWebPostAndGet.HttpPost(ptPostUrl, ptPostParam);
  7. }
  8. catch (Exception ex)
  9. {
  10. Log.WriteLog("接口推送出错:", ex.Message, ptPostParam + "\r\n接口地址" + ptPostUrl);
  11. }
  12. }

创建数据集转xml方法

创建一个DataTable2Xml方法来实现,将Oracle数据库检索出来的结果集,转换成xml,方法写在web类中,代码如下

  1. public static string DataTable2Xml(DataTable table)
  2. {
  3. if (null == table) return string.Empty;
  4. if (string.IsNullOrEmpty(table.TableName))
  5. {
  6. table.TableName = "Row";
  7. }
  8. StringWriter writer = new StringWriter();
  9. table.WriteXml(writer);
  10. string xmlStr = writer.ToString().Replace("<DocumentElement>", "").Replace("</DocumentElement>", "");//转换出的xml里自动添加了DocumentElement根节点,上网找了好多方法都没法修改,只好用Replace函数替换掉。
  11. writer.Close();
  12. return "<MESSAGE><ReturnCode>" + table.Rows.Count + "</ReturnCode><ErrorMessage>查询成功</ErrorMessage><Data><Rows>" + xmlStr + "</Rows></Data></MESSAGE>";//组装成所需xml格式
  13. }

配置文件

本例中的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>

Webservice接口本地调试

在解决方案资源管理器-创建的web项目上右键-设为启动项目-点击工具栏小三角在本地浏览器运行IIS,如图:

本例用的是360浏览器,会自动在本地打开服务的目录(有些机器可能要需要百度下设置目录打开权限,这里不赘述)在打开的目录点击ForNisServices.asmx(本例的web类)。如下图:

进入到接口方法调用界面,鼠标点击对应方法名调用方法,带入参的方法需要在对应入参输入,如下图:

点击无入参方法DictDept-点击调用,得到接口返回

点击调用之后的界面显示的是DictDept方法返回的数据,内容啥的别在意哈,如图:

点击带入参方法MzDisease,在参数列表值列填入参数,点击调用,得到接口返回数据。如下图:

         另外:除了可以用本地浏览器测试接口,也可以在点击三角符号之后,用SoapUI等一些webservice调试工具测试接口。本例不赘述。

项目打包

Webservice服务测试通过之后,需要将项目打包部署到生产库服务器上,步骤是:打开解决方案资源管理器-在创建的web项目上右键-发布,设置发布的路径,如图

本例路径是E:\source\publish\WebServicePass,Vs2022会在该路径下生成对应的程序文件夹,将文件夹拷贝到生产库服务器上,然后配置IIS,启动服务。

生产环境IIS部署

打开IIS管理器,在网站选项右键-添加网站,如图

在弹出添加网站界面,网站名称填入名称,物理路径选择上一步打包项目拷贝所在的生产环境文件夹路径,本例是D:\WebServicePass,设置IP和端口,注意端口不要与其他在用端口冲突,最后点击确定。如下图:

点击刚才添加的网站-双击目录浏览-弹出界面点击启用,如下图

点击刚才添加的网站-双击日志-弹出界面点击启用,如下图

设置完,点击启动,点击浏览网站下的网址,在浏览器即可看到webservice接口的方法。调用方式和webservice接口本地调试操作一致,也可以用SoapUI等工具调试,这里不赘述。如下图:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/596862
推荐阅读
相关标签
  

闽ICP备14008679号