编写Asp.Net Web服务的最佳方式是在野外播放

时间:2011-05-12 15:25:28

标签: asp.net web-services api

我正在为我的ASP.NET应用程序编写一个其他开发人员将使用的API。 API将基本返回具有其名字,姓氏和ID的人员列表。有很多方法可以在ASP.NET中编写Web服务,最简单的方法是创建一个返回DataTable的Web服务函数(asmx)。这对于其他.NET开发人员来说很简单,但我不相信这是为一般平台和语言独立性编写Web服务的最佳方式。

目前公认的标准是什么,这样的网络服务今天在野外发挥得很好?

2 个答案:

答案 0 :(得分:3)

经验中浮现的一些想法:

  1. 使用WCF,而不是.asmx。 WCF执行ASMX文件所做的所有事情,并且通常取代ASMX服务(请参阅herehere)。
  2. 使用简单的POCO数据类型编写方法,例如List<Person>而不是DataTable。基本类型更容易序列化,并且在其他编程环境中更有意义,因为您希望您的服务与语言无关。
  3. 提供用于管理数据的通用CRUD方法。根据您的服务使用方式,如果用户需要修改数据,一种简单的方法是提供使用相同数据类型的getBlah()updateBlah(obj newObj)deleteBlah(obj objToDelete)等。
  4. 隐藏服务使用者不需要知道的详细信息,而不是盲目地公开所有数据类型,结构和字段名称。这将使您的服务更加强大,可以处理内部更改,您可以简化和控制最终用户看到的内容。例如,如果您有一个包含30个属性的Person类,并且只有5个与最终用户相关,请提供一个在PersonPersonSimple类之间接口的类。如果没有这一层,您的最终用户将不得不在每次更改数据结构时修改您的代码,并且您将被这种紧密耦合锁定。
  5. 如果安全很重要

    1. 通过SSL执行您的服务。这可以保护通过电线传输的数据不被嗅探。
    2. 使用Login方法和会话或SOAP标头进行身份验证。除非存在某种身份验证方案,否则默认情况下服务是匿名的。即使您认为没有人会找到您的服务,因为您只向用户提供了URL,但它会以某种方式在某个地方出现,并且人们将会尝试滥用该服务。此外,您可以通过不同的登录和授权方案控制谁可以做什么。

答案 1 :(得分:0)

我目前正在处理类似的问题:.NET中的web api服务接收数据表作为输入参数,对它们应用一些操作(使用表值函数),并返回一些输出数据表。

在您的情况下,您不需要使用像DataTable这样的复杂类;你可以使用一个简单类的数组(List&lt;&gt;),其中包含名字,姓氏和id等字段。使用ASP.NET的Web Api,您可以执行以下操作:

1)在Visual Studio中创建一个新的WebApi项目:例如(在VS 2012中)C#&gt;网络&gt; ASP.NET MVC 4 Web应用程序&gt;选择&#34; Wep Api&#34;作为项目模板

您将看到一个包含大量文件夹的VS项目,其中包括一个名为 Models

的文件夹

如需帮助,请参阅:http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

2)使用如下所示的类创建一个新的模型代码文件 Person.cs

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string[] Friends { get; set; }
}

3)使用获取,插入和更新数据库记录的方法创建新的控制器代码文件 PersonController.cs 。所有必要的序列化/反序列化(JSON和XML)和数据绑定都是由项目模板设置的Web Api环境自动完成的。

    // Get all the records of persons
    public IList<Person> Get()
    {
        // read database into a list of persons (List<Person>)
        // return List<Person>
    }

选定人员的返回记录:

   public Person Get(int id)
   {
        // read database for a selected person
   }

参数绑定(读取http POST发送到对象或列表对象中的JSON / XML内容)也会自动完成,如下所示:

    // parameter binding: Create a Person object with content from XML/JSON 
    public void ReadPerson(Person p)
    {
       Trace.WriteLine(Person.Id);
    }


    public void ReadPersonList(List<Person> plist)
    {
       Trace.WriteLine(plist.Count);
    }