65.9K
CodeProject 正在变化。 阅读更多。
Home

如何通过 IIS 7.5 上托管的 RESTful WCF 服务从 iPhone 应用访问 SQL 数据库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (25投票s)

2012年6月19日

CPOL

5分钟阅读

viewsIcon

192164

downloadIcon

2675

通过 IIS 7.5 上托管的 WCF 和 JSON 服务从 iPhone 访问 SQL 数据库

介绍 

如果您正在寻找一种方法,可以通过移动电话(如 Android 或 iPhone)访问 Microsoft SQL 数据库,并希望获得一个如何实现和测试的示例,那么这可能会对您有所帮助。 

背景        

从移动应用获取 SQL 数据的一种方法是通过 RESTful WCF 服务。WCF 服务将公开数据库并返回 JSON 数据,iPhone 应用可以使用 HTTP 请求消耗这些数据。

本文假设您对 WCF、SQL 数据库和 iPhone 编程有基本的了解。在本教程中,我将构建一个 WCF 服务来公开一个简单的 SQL 数据库“EmpDB”,将该服务托管在 IIS 7.5 上,并以 JSON 格式返回员工信息,该信息将在 iPhone 应用程序中被使用。本示例使用以下工具构建: VS2010、SQLServer 2008、.Net Framework 4.0 和 iOS 5。   

为什么选择 JSON 而不是 XML?    

  1. 更好地表示与语言无关的数据结构
  2. 简单、定义明确、易于解析且易于阅读。  
  3. 轻量级有效负载 = 减少带宽 = 更快的传输 
  4. iOS 具有出色的原生 JSON SDK,解析起来非常简单且速度极快。  

使用代码      

如果您已经在计算机上有一个要公开的 SQL 数据库,则跳到步骤 #1。否则,创建一个简单的 SQL 数据库,为了保持一致性,您可以使用像我的这样的 SQL 数据库。将其命名为“EmpDB”,创建一个名为“EmpInfo”的表,包含三个字段:    

  • 姓(nchar(10) 类型)       
  • 名(nchar(10) 类型)   
  • 薪水(decimal 类型)         

可以看到,我的数据库中有 5 条记录,我希望将它们获取到我的 iPhone 应用中。 

要完成此目标,需要以下五个简单步骤: 

  1. 创建新的 WCF 服务  
  2. 添加接口代码 
  3. 实现服务    
  4. 远程测试服务  
  5. 从 iOS 等移动应用消耗 JSON?   

1. 创建新的 WCF 服务 

文件 > 新建项目 > C# > WCF 服务 >“JsonWcfService” 

删除自动生成的 IService1.cs 和 Service1.svc 文件。我们将创建自己的文件。 

添加 WCF 服务:文件 > 新建项 > C# > WCF 服务 >“GetEmployees.svc”。 

这将创建两个文件:接口文件“IGetEmployee.svc”和服务实现文件“GetEmployee.svc”。 

2. 添加接口代码    

将以下代码添加到接口“IGetEmployee 文件”。 

using System.ServiceModel.Web;
 
namespace JsonWcfService
{
    [ServiceContract]
    public interface IGetEmployees
    {
        [OperationContract]
        //attribute for returning JSON format
        [WebInvoke(Method = "GET",
            ResponseFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.Wrapped,
            UriTemplate = "json/employees")]
        //method
        List<Employee> GetAllEmployeesMethod();
    }
} 

添加对System.ServiceModel.Web 的引用。如果此框架不可用,请右键单击项目 > 属性 > 应用程序选项卡 > 目标 > 并确保选择了 .Net Framework 4.0。   

方法之前的 WebInvoke 属性可确保数据以 JSON 格式返回。如果您有兴趣返回 XML,则可以是 WebMessageFormat.Xml。   

接口有一个名为“GetAllEmployeesMethod”的方法,该方法从数据库返回员工列表。在下一步的服务代码中,需要实现此方法。 

  

3. 实现服务 
将以下代码添加到实现文件“GetEmployees.svc”。此服务文件实现了接口方法“GetAllEmployeesMethod”。在此方法中,我只是打开与本地 SQL 数据库“EmpDB”的简单连接,使用所有默认设置以保持简单。我通过查询“EmpInfo”表来获取所有员工的姓名、名和薪水列表。请确保添加对 System.Data.SqlClient 的引用以公开 SQL 操作以及对System.Runtime.Serialization 的引用以公开[DataContract] 属性,如以下图像所示。  

using System.Data.SqlClient;
using System.Runtime.Serialization;
namespace JsonWcfService
{
    public class GetEmployees : IGetEmployees
    {
       public List<Employee> GetAllEmployeesMethod()
        {
             List<Employee> mylist = new List<Employee>();
 
            using (SqlConnection conn = new SqlConnection("server=(local);database=EmpDB;Integrated Security=SSPI;"))
            {
                conn.Open();
 
                string cmdStr = String.Format("Select firstname,lastname,salary from EmpInfo");
                SqlCommand cmd = new SqlCommand(cmdStr, conn);
                SqlDataReader rd = cmd.ExecuteReader();
               
                if (rd.HasRows)
                {
                    while (rd.Read())
                        mylist.Add(new Employee(rd.GetString(0), rd.GetString(1), rd.GetDecimal(2)));
                }
                conn.Close();
            }
 
            return mylist;
        }
    }
 
    [DataContract]
    public class Employee
    {
        [DataMember]
        public string firstname { get; set; }
        [DataMember]
        public string lastname { get; set; }
        [DataMember]
        public decimal salary { get; set; }
        public Employee(string first, string last, decimal sal)
        {
            firstname=first;
            lastname=last;
            salary=sal;
        }
    }
}   

现在,像这样调整项目解决方案资源管理器中的 web.config 文件。请注意,我使用了 binding="webHttpBinding" 和 <webHttp/>。没有这些调整,项目将无法正常工作!    

<services>
      <service name="JsonWcfService.GetEmployees" behaviorConfiguration="EmpServiceBehaviour">
        <endpoint address ="" binding="webHttpBinding" contract="JsonWcfService.IGetEmployees" behaviorConfiguration="web">
        </endpoint>
      </service>
    </services>
 
    <behaviors>
      <serviceBehaviors>
        <behavior name="EmpServiceBehaviour">
          <serviceMetadata httpGetEnabled="true"/>
         <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>

WCF 服务就完成了。以 Release 和 Debug 模式进行编译。按 Ctrl+F5 运行,这将打开一个显示 GetEmployeeService 的浏览器,例如 https://:7794/GetEmployees.svc。如果您想查看员工列表,可以在浏览器中输入以下内容:https://:7794/GetEmployees.svc/json/employees 

WCF 服务以 JSON 格式返回我们的数据库中的员工列表,并托管在 IIS 中。但是,我如何才能将员工列表获取到我的 iPhone 或 Android 应用程序中并进行测试呢? 

到目前为止我们所做的只能在同一开发机上进行测试,但无法从不同的机器或从我们的目标 iPhone 应用访问。为此,我们需要使用某个网站托管服务。要做到这一点,您需要选择一个包含运行网站所需文件的文件夹。 

4. 远程测试服务  

创建和运行网站: 

- 创建一个新的文件夹 C:/JsonWcfService。两个文件将放在这里:一个 .svc 文件和一个 web.config 文件。  

- 在 C:/JsonWcfService 下,打开新的记事本文档,将其命名为“GetEmployees.svc”,并在此处放入以下行:  

<% @ServiceHost Service="JsonWcfService.GetEmployees" %>  

- 打开新的记事本文档,将以下代码放入其中,并将其命名为“web.config”。基本上,这里的端点和服务行为必须与 Visual Studio 中服务的 web.config 匹配。 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="JsonWcfService.GetEmployees" behaviorConfiguration="EmpServiceBehaviour">
        <endpoint address ="" binding="webHttpBinding" contract="JsonWcfService.IGetEmployees" behaviorConfiguration="web">
        </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="https://:8000/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    
    <behaviors>
      <serviceBehaviors>
        <behavior name="EmpServiceBehaviour">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>   

- 创建一个新的子文件夹 C:/JsonWcfService/bin,并将 “JsonWcfService.dll” 从您的 ~project/bin 目录复制到 C:/JsonWcfService/bin。   

- 现在,我们只需要在 IIS7.5 中添加网站并将指向我们刚刚创建的文件夹:   

  • 从命令提示符或 Windows 搜索框中打开 IIS(Internet Information Services)管理器。 
  • 在“连接”树下,展开“站点”> 右键单击“默认网站”> 添加应用程序。
  • 使用“JsonWcfService”作为别名,并浏览到“C:\JsonWcfService”文件夹作为物理路径。
  • 按确定。 

 

完成了。要从同一台机器获取员工列表,请在浏览器中键入以下链接:https:///JsonWcfService/GetEmployees.svc/json/employees 

要从您内网中的远程计算机获取员工列表:http://"yourIPAddress"/JsonWcfService/GetEmployees.svc/json/employees      

将“yourIPAddress”替换为主机服务的计算机的 IP 地址。获取 IP 地址:命令提示符 > ipConfig。    

例如:http://192.168.1.104/JsonWcfService/GetEmployees.svc/json/employees       

5. 在 iPhone 应用程序中消耗 JSON  

幸运的是,iOS5 具有原生 JSON SDK,这将使这项任务非常直接。   

在 iOS 中,添加一个基本的简单视图应用程序,包含 2 个 UILabel 来显示 JSON 文本,以及更易读的格式。将它们连接起来。

@property (weak, nonatomic) IBOutlet UILabel *jsonText;
@property (weak, nonatomic) IBOutlet UILabel *humanText;  

将以下代码添加到您的 viewDidLoad 方法中:   

//wcf service
#define WcfSeviceURL [NSURL URLWithString: @"http://192.168.1.102/JsonWcfService/GetEmployees.svc/json/employees"]
 
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSError *error = nil;
    NSData *data = [NSData dataWithContentsOfURL:WcfSeviceURL options:NSDataReadingUncached error:&error];
    jsonText.text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
 
    if(!error)
    {
        NSDictionary* json = [NSJSONSerialization 
                              JSONObjectWithData:data 
                              options:NSJSONReadingMutableContainers 
                              error:&error];  
        
        NSMutableArray *array= [json objectForKey:@"GetAllEmployeesMethodResult"];
        
        for(int i=0; i< array.count; i++)
        {
            NSDictionary *empInfo= [array objectAtIndex:i];
            
            NSString *first = [empInfo objectForKey:@"firstname"];
            NSString *last = [empInfo objectForKey:@"lastname"];
            NSString *salary  = [empInfo objectForKey:@"salary"];
            
            //Take out whitespaces from String
            NSString *firstname = [first
                                   stringByReplacingOccurrencesOfString:@" " withString:@""];
            NSString *lastname = [last
                                   stringByReplacingOccurrencesOfString:@" " withString:@""];
            
            humanText.text= [humanText.text stringByAppendingString:[NSString stringWithFormat:@"%@ %@ makes $%@.00 per year.\n",firstname,lastname,salary]];
        }
        
    }
}

注意使用了 NSJSONSerialization 类,它将 JSON 对象转换为 NSFoundation 对象,如 NSDictionary、NSArray、NSString。因此, NSDictionary* json 包含员工列表。 

所以,这里是显示在 iPhone 应用中的员工列表输出,以 JSON 和可读格式显示。 

r    

值得关注的点  

本文为您提供了跨平台访问数据的初步体验。随着移动行业的日益增长,跨越界限变得势在必行。移动应用经常需要与其他服务器和数据库进行通信。RESTful WCF 是一种不错的轻量级解决方案,可以返回 JSON 或 XML,并且可以被不同的技术使用,这使得它对未来非常灵活。WCF 服务为传统的 Web 服务提供了一个很好的替代方案。

历史  

V1.0 2012 年 6 月 18 日

© . All rights reserved.