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

本例开发工具用的是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入参是请求报文,代码如下:

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

创建oracle访问类

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(),有三个入参hiscodepatientidclinicno,都是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方法

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);
     }
 }

创建数据集转xml方法

创建一个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>

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等工具调试,这里不赘述。如下图:

### 回答1: C# WebService 接口开发教程 1. 创建 WebService 应用程序 在 Visual Studio 中,选择“新建项目”,选择“ASP.NET Web 服务应用程序”,输入项目名称,点击“确定”按钮。 2. 添加 WebService 接口 在 Solution Explorer 中,右键单击项目名称,选择“添加新项”,选择“Web 服务”,输入 WebService 名称,点击“添加”按钮。 3. 编写 WebService 接口代码 在 WebService 文件中,编写 WebService 接口代码。例如: ``` [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class MyWebService : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } } ``` 4. 调试 WebService 接口 在 Visual Studio 中,点击“调试”菜单,选择“启动调试”,浏览器将打开 WebService 的测试页面。 5. 调用 WebService 接口 在客户端应用程序中,添加 WebService 引用。例如: ``` using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using MyWebService; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { MyWebService.MyWebService ws = new MyWebService.MyWebService(); string result = ws.HelloWorld(); Response.Write(result); } } ``` 以上就是 C# WebService 接口开发的基本流程。 ### 回答2: 很抱歉,您的问题不明确。请提供更多信息以便我能够回答您的问题。 ### 回答3: 很抱歉,由于缺乏上下文,我无法理解和回答“c”这个问题,请您尽可能提供更多的信息和背景。感谢您的理解。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值