.net – 帮助理解Web服务和REST

我一直渴望提出这个问题,但现在才找到时间.

无论如何,关于Web服务(是的,那些传统的SOAP-XML响应服务)和RESTful服务(很多开发人员现在都在讨论)已经有了很多讨论.

我觉得虽然我总体上理解REST的概念,但我需要了解更多.我认为完全接受它的一个最好的方法是表明它真的更好(强调**更好是一个主观词),就像现在正在做的那样.

请考虑以下简单的传统代码:(这个代码是从Oracle作为后端的企业应用程序中复制的.我认为数据库无关紧要,因为您可以在SQL Server或Oracle或任何数据库之间轻松切换).

myWebService.asmx.cs

namespace MyApplication
{
    public class myWebService : System.Web.Services.WebService
    {
        private classEmployee _emp = new classEmployee();

        [WebMethod]
        public string GetEmployees()
        {
            string EmployeeData = string.Empty;
            EmployeeData = _emp.GetEmployees();
            return EmployeeData;
        }
    }
}

classEmployee.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.Data.OracleClient;

namespace MyApplication.App_Code
{
    public class classEmployee
    {
        private DataAccess _da;

        public string GetEmployees()
        {
            string employeeData = string.Empty;
            string cmd = string.Empty;
            OracleCommand oraCmd = new OracleCommand();
            DataSet ds = new DataSet();

            try
            {
                 cmd = "SELECT * FROM Employees";

                oraCmd.CommandType = CommandType.Text;
                oraCmd.CommandText = cmd;
                ds = (DataSet)_da.ExecSQLQueryCmd(oraCmd, DataAccess.ResultType.DataSet);
                employeeData = ds.GetXml
                ds.Dispose();
            }
            catch (Exception ex)
            {
                employeeData = "Error: " + "Getting Employees [GetEmployees]" + Environment.NewLine + "Details: " + Environment.NewLine + ex.Message;
            }

            return employeeData;
        }
    }
}

DataAccess.cs

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.OracleClient;

namespace MyApplication.App_Code
{
    public class DataAccess
    {
        private OracleConnection oraConn;
        private String connString;

        public enum ResultType
        {
            DataReader = 0,
            DataSet = 1,
            DataTable = 2
        }

        public DataAccess()
        {
            connString = System.Configuration.ConfigurationManager.ConnectionStrings["AppConnectionString"].ConnectionString;
        }

        public object ExecuteSQLCommand(OracleCommand oraCommand, ResultType ReturnType, string TableName = "")
        {
            OracleDataAdapter oraDataAdapter = new OracleDataAdapter(oraCommand);
            oraConn = new OracleConnection(sConnectionString);

            try
            {
                oraConn.Open();
                oraCmd.Connection = oraConn;
                oraCmd.CommandType = CommandType.Text;

                switch (ReturnType)
                {
                    case ResultType.DataReader:
                        OracleDataReader oraDataReader = null;
                        oraDataReader = oraCmd.ExecuteReader();
                        return oraDataReader;

                    case ResultType.DataSet:
                        DataSet ds = new DataSet();
                        oDataAdapter.Fill(ds);
                        oraConn.Close();
                        oraConn.Dispose();
                        return ds;

                    case ResultType.DataTable:
                        DataTable dt = new DataTable();

                        if (!string.IsNullOrEmpty(TableName))
                            dt.TableName = TableName;
                        oDataAdapter.Fill(dt);
                        oraConn.Close();
                        oraConn.Dispose();
                        return dt;
                }
            }
            catch (OracleException oException)
            {
                throw oException;
            }
            finally
            {
                oDataAdapter.Dispose();
                oDataAdapter = null;
                oraCmd.Dispose();
            }

            return null;
        }

        public int ExecuteSQLNonQueryCommand(OracleCommand oraCommand)
        {
            // This will execute any NON-QUERY command.
            //Trimmed for Brevity purposes..
        }
    }
}

上面的代码非常自我解释.调用Web服务并以XML格式获取结果数据.要执行非查询命令,只需替换命令对象中传递的命令字符串,然后在DataAccess.cs类中调用必要的方法.

我已经不知所措,为什么至少应该避免上述问题,而是选择RESTful服务类型调用.但我还没有看到任何至少有助于将此代码转换为至少包含RESTful架构的内容.

我很确定很多人会使用这个(请注意,我目前仍然使用很多)基于以下原因:

>它的工作原理.
>易于实施,维护和管理.
>进行数据库驱动开发的人员非常喜欢SQL命令,能够轻松地将我们在SQL编辑器中使用的SQL字符串轻松地应用到应用程序中,这是一个很大的松了一口气.当您可以使用上面的示例简单地实现所有多个查询(包括存储过程)时,为什么要使用ORM?
>大多数可用于数据相关应用程序的代码示例显示与上面相同的模式(数据集从Command对象填充,并作为DataSet或XML返回等).

为了让人们接受人们在这个编码领域中所称的“最佳实践”,人们应该说明为什么它更好,以及如何更容易地做这样的事情而不是经过尝试和测试的工作.

如果我可以请求我们的专家开发人员向我展示如何转换它,以及为什么转换为REST会更好(通过代码)的一些解释,那么我将非常感激.

感谢您的意见.谢谢.

额外:
我只想指出,虽然这是正确的,但在阅读本文之后,我开始怀疑这种方法是否是最好的:

http://www.codeproject.com/Feature/WeirdAndWonderful.aspx?msg=4324770#xx4324770xx

上面的文章,正如一篇评论所说 – “在网络服务中发现我正在升级.很难找到任何没有错的东西.”

我正试图建立一个真正的错误,因为我在一个绑定.

让我给你一些情况:

>客户/客户要求您提供查询存储在数据库中的信息的应用程序.
>您使用上述方法提出解决方案.提供客户要求的要求.该解决方案可靠,快速且可维护.

所以从本质上讲,我不得不问的另一个问题是,上面的代码到底是什么问题?

最佳答案 要转换它,虽然这不是我的头脑,它看起来像这样.

namespace MyApplication 
{ 
    public class myWebService : System.Web.Services.WebService 
    { 
        private classEmployee _emp = new classEmployee(); 

        [HttpGet]
        public string GetEmployees() 
        { 
            string EmployeeData = string.Empty; 
            EmployeeData = _emp.GetEmployees(); 
            return EmployeeData; 
        } 
    } 
}

你可以在任何易于被消费者转换的东西中返回该字符串.如果它是JavaScript,那么我会推荐JSON,因为它是原生的.

我们来谈谈ReST一分钟.我觉得ReST最有趣的部分是老式的ASMX服务是ReSTful.但是,由于IT行业存在一个问题,即接受旧技术可能更加正确的事实,他们不得不将其命名为新鲜事物.

他们也使用术语Client / Server来做到这一点.在微软出现之前几年,IBM正在进行客户端/服务器操作,并说,嘿,我们需要将所有内容都归功于PC.嗯,当它开始变得不那么受欢迎,因为部署是一场噩梦,他们意识到,哦,伙计,我们需要回到IBM一直在做的事情.大型服务器,愚蠢的客户端和简单的部署.但是,他们不能称之为,因为业界不会接受这一点而微软不希望这样,所以他们称之为云(在这里插入流浪汉,流浪汉,流浪音乐).

所以,快进到SOAP.人们希望能够通过线路传输复杂的对象,而不必反序列化它们,并且他们需要协议的灵活性.好吧,SOAP为您提供了两者,Microsoft生成客户端表示和反序列化,WCF层允许协议的真正灵活性,而ReST只能通过HTTP传输,因为它使用标准动词.

那么,你问题的真正答案是,你需要什么?

>对于非常大的数据集而言,SOAP比ReST更重且效率更低,因为它不是浏览器的本机操作,而且信封很大.但话又说回来,你真的应该将多少数据转​​移到客户端?!?
>您是否希望单击生成客户端模型?然后使用SOAP.
>您是否希望API更易于访问其他编程范例?然后使用ReST.
>您现在想要继续关注其他行业吗?然后使用ReST.

还有更多的讨论要做,但这应该让你开始. ReST并不比SOAP好,它有所不同,它解决了一系列不同的问题. Law of the instrument,不要让自己或其他人跟你说话.

点赞