4

我一直很想问这个问题,但现在才找到时间这样做。

无论如何,关于 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;
        }
    }
}

类雇员.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;
        }
    }
}

数据访问.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 代码轻松地用于应用程序,这让我们松了一口气。当您可以使用上面的示例简单地实现所有多个查询(包括存储过程)时,为什么还要使用 ORM。
  4. 大多数可用于数据相关应用程序的代码示例都显示了与上述相同的模式(从 Command 对象填充数据集,并以 DataSet 或 XML 等形式返回)。

如果要接受人们在这一编码领域中所谓的“最佳实践”,就应该说明为什么它更好,以及做这样的事情比已经尝试和测试工作的事情容易得多。

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

感谢您的投入。谢谢。

补充:我只是想指出,虽然这是正确的,但在阅读了这篇文章后,我开始怀疑这种方法是否是最好的:

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

上面的文章,正如一位评论所说的那样——“在我正在升级的网络服务中发现了这个。很难找到任何没有错的地方。”

我正试图确定这到底有什么问题,因为我处于困境中。

让我给你一些情况:

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

所以本质上,我想问的另一个问题是,上面的代码到底有什么问题?

4

1 回答 1

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 在微软出现并说嘿,我们需要把所有东西都放到 PC 之前几年就在做客户端/服务器操作。好吧,当这开始变得不那么流行时,因为部署是一场噩梦,他们意识到,哦,伙计,我们需要回到做 IBM 一直在做的事情。大型服务器、愚蠢的客户端和简单的部署。但是,他们不能这样称呼它,因为业界不会接受它,而微软也不想要它,所以他们称之为The Cloud (在此处插入 bum,bum,bum 音乐)

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

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

  1. SOAP 比 ReST 更重且在非常大的数据集上的性能通常低于 ReST,因为它不是浏览器的本机操作并且信封很大。但是话又说回来,你真的应该向客户端传输多少数据?!?
  2. 您想要一键生成客户端模型吗?然后使用 SOAP。
  3. 你想让 API 更容易被其他编程范式访问吗?然后使用休息。
  4. 你现在想跟其他行业一样吗?然后使用休息。

还有更多的讨论要讨论,但这应该让你开始。ReST 并不SOAP 好,它是不同的,它解决了一组不同的问题。不要让自己或他人说服你进入仪器法则

于 2012-08-03T17:06:17.673 回答