帮助理解Web服务和REST

时间:2012-08-03 16:47:02

标签: .net sql web-services rest data-access

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

无论如何,关于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架构的内容。

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

  1. 有效。
  2. 易于实施,维护和管理。
  3. 进行数据库驱动开发的人非常喜欢SQL命令,能够轻松地将我们在SQL编辑器中使用的那些SQL chops轻松地应用到应用程序中。当您使用上面的示例简单地实现所有多个查询(包括存储过程)时,为什么要使用ORM。
  4. 大多数可用于数据相关应用程序的代码示例显示与上面相同的模式(数据集从Command对象填充,并作为DataSet或XML返回等。)。
  5. 对于一个接受人们称之为“最佳实践”的人来说,在这个编码领域,人们应该说明为什么它更好,以及如何更容易地做这样的事情而不是经过尝试和测试工作的那个

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

    感谢您的输入。感谢。

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

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

    上面的文章,如评论所述 - “在网络服务中发现我正在升级。很难找到任何没有错的。”

    我正在尝试建立一个真正错误的东西,因为我处于绑定状态。

    让我告诉你一些情况:

    1. 客户/客户要求您提供查询存储在数据库中的信息的应用程序。
    2. 您使用上述方法提出了解决方案。提供客户要求的要求。该解决方案可靠,快速且可维护。
    3. 所以从本质上讲,我不得不问的另一个问题是,上面的代码出了什么问题?

1 个答案:

答案 0 :(得分:2)

要转换它,虽然这不是我的头脑,它看起来像这样。

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正在进行客户端/服务器运营,并表示,我们需要将所有 down 带到PC上。好吧,当它开始变得不那么受欢迎,因为部署是一个噩梦他们意识到,哦,伙计,我们需要回到IBM一直在做的事情。大型服务器,愚蠢的客户端和简单的部署。但是,他们不能称之为,因为该行业不会接受,微软不希望这样,所以他们称之为The Cloud (在这里插入流浪汉,流浪汉,流浪汉音乐)

所以,快进SOAP。人们希望能够通过线路传输复杂的对象,必须反序列化他们需要协议的灵活性。好吧,SOAP给你们两个,微软生成客户端表示和反序列化 WCF层允许协议的真正灵活性,而ReST只能 通过HTTP传输,因为它使用了标准动词。

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

  1. SOAP非常重,并且在非常大的数据集上的性能通常低于ReST,因为它不是浏览器的本机操作信封很大。但话又说回来,你真的应该把多少数据转​​移到客户端?!?
  2. 您是否希望单击生成客户端模型?然后使用SOAP。
  3. 您是否希望API更易于访问其他编程范例?然后使用ReST。
  4. 您现在想要了解其他行业吗?然后使用ReST。
  5. 还有更多的讨论要做,但这应该让你开始。 ReST不比SOAP强更好,它有所不同,它解决了一系列不同的问题。 不要让自己或其他人跟你说Law of the instrument