上一篇,我们讲到了如何利用BCS服务,直接连接到SQL Server数据库实现一些简单的应用程序集成的场景。看起来很不错,不是吗?

但是,事实上,直接连接到数据库也许有时候是不可能实现的任务,很多系统并不可能直接将数据库暴露出来的。地球人都知道,那样的风险极高。

那么,比较可行的是什么方式呢?我觉得很多系统倒是有公开一些服务,这些服务有的使用Web Service实现,有的不是。这都不要紧。总之,由这些服务去连接数据库,而我们做集成的时候,并不需要知道数据库在哪里?以及什么结构等等信息。

这一篇,我们讲解使用WCF作为服务,实现应用程序集成的简单步骤

1. 创建一个测试用的服务

为了快速开发,我们会将该服务宿主在一个Web Application中,所以首先我们需要创建这个Application

默认会有下面这样的项目结构

我们无需修改default.aspx.因为我们根本不使用它

为了读取数据库,我们可以创建一个LINQ to SQL数据模型

我们可以将Northwind数据库的连接定义在Server Explorer中,并且将Employees表拖拽到这个设计器中来

保存该模型。下面我们就来添加我们的服务了

修改这个IEmployeeService成下面这样

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace NorthwindService
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IEmployeeService" in both code and config file together.
[ServiceContract]
public interface IEmployeeService
{
[OperationContract]
Employee[] GetEmployeeList();
[OperationContract]
Employee GetEmployeeItem(int id);
}
}

接下来修改EmployeeService.svc.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace NorthwindService
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "EmployeeService" in code, svc and config file together.
public class EmployeeService : IEmployeeService
{
public Employee[] GetEmployeeList()
{
NorthwindDataContext context = new NorthwindDataContext();
return context.Employees.ToArray();
}
public Employee GetEmployeeItem(int id)
{
NorthwindDataContext context = new NorthwindDataContext();
return context.Employees.FirstOrDefault(e => e.EmployeeID == id);
}
}
}

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

这样就好了,下面我们可以测试该服务了

选中“EmployeeService.svc”这个文件,右键,

如果看到下面这样的界面,则基本上是表示服务创建没有什么大的问题

点击http://localhost:8027/EmployeeService.svc?wsdl这个链接

我们可以用一个工具来测试一下到底能不能返回正确的结果

点击“File”=》”Add Service”,然后输入服务地址

【注意】你的地址可能和我不一样,主要检查端口号

双击GetEmployeeItem,输入一个id的值(例如10),然后点击 ”Invoke“按钮

好,如果是这样的话,则表示该服务是能够正常工作的。

2. 创建BCS 内容类型,使用该服务

既然服务准备好了,下面我们就来看看如何在BCS外部内容类型中使用该服务

首先,仍然是在下面的界面中,点击左上角的 “External Content Type”按钮

然后做一些必要的修改,使界面看起来像下面这样

仍然是点击”Click here to discover external data sources …“

再次点击 “Add Connection”

将Type设置为WCF Service

Ooooop ,我收到了一个错误

它的意思是说,不能使用localhost这个写法。好吧,我们从善如流吧。我们可以将网站发布到IIS

【注意】这个发布向导是VS2010新增的,还可以

发布之后,应该可以看到IIS中如下的效果

然后,我们确认在浏览器中,可以通过下面的地址访问到服务

http://nymoss2010/NorthwindServices/EmployeeService.svc

修改下面的地址

但是却仍然是报告错误

My God ! 好吧,再大的困难也难不倒英雄的中华儿女们。为了排除到底是不是IIS的问题,我们可以单独来做一个宿主好了。

添加引用

在Main方法中编写如下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using NorthwindService;
using System.ServiceModel.Description;
namespace EmployeeServiceHost
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(
typeof(EmployeeService), new Uri("http://nymoss2010/NorthwindService")))
{
host.AddServiceEndpoint(
typeof(IEmployeeService).FullName,
new BasicHttpBinding(),
"");
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
host.Description.Behaviors.Add(behavior);
host.AddServiceEndpoint(
"IMetadataExchange",
MetadataExchangeBindings.CreateMexHttpBinding(),
"mex");
host.Open();
Console.WriteLine("Server is ready");
Console.Read();
}
}
}
}

同时,在这个宿主中添加一个配置文件app.config,编辑内容如下 .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

providerName="System.Data.SqlClient" />

将该程序启动为调试状态

然后可以通过下面地址访问到该服务

然后再去添加该服务吧

【注意】Service Metadata URL是有一个?wsdl的后缀的

【注意】我们发现现在是可以了。所以刚才那个应该是IIS某些地方出了问题,也可能是因为beta版的缘故吧。暂时不理会它。

选中 “GetEmployeeList”,右键,选择”New Read List Operation“

点击Next

继续Next

选中”EmployeeId“,将其Map toIdentifier

点击Finish完成该Operation的定义

然后,我们再 选中GetEmployeeItem,右键,New Read Item Operation

【注意】这里也需要Map to identifier

保存(CTRL+S) ,然后点击“Create Lists & Form”按钮

创建成功之后,我们兴冲冲地去网页中查看这个列表,却发现如下的错误

这是好事多磨啊,  focus,focus……. 继续排除错误

我用之前用过的一个工具,来确认一下方法哪里出了问题。我发现果然是那个GetEmployeeList出现了问题

但是,GetEmployeeitem却是可以返回的

那么,这说明什么问题呢?我联想到员工表是有一个相片字段的,而相片的长度是很长的,应该是总的数据量超过了WCF的默认限制(64KB)所导致的问题

为了验证我的想法,我修改一下源代码

        public Employee[] GetEmployeeList()
{
//NorthwindDataContext context = new NorthwindDataContext();
//return context.Employees.ToArray();
return new Employee[]{
new Employee(){EmployeeID=1,FirstName="Ares",LastName="Chen"}
};
}

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

然后再测试

现在就可以正常返回了。所以,我们如果回到网页中去,刷新列表,应该也是可以的

为了避免图片导致数据太大,我们修改了代码如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace NorthwindService
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "EmployeeService" in code, svc and config file together.
public class EmployeeService : IEmployeeService
{
public Employee[] GetEmployeeList()
{
NorthwindDataContext ctx = new NorthwindDataContext();
Listresult = new List();
foreach (var e in ctx.Employees)
{
result.Add(new Employee
{
EmployeeID = e.EmployeeID,
FirstName = e.FirstName,
LastName = e.LastName,
Country = e.Country,
Region = e.Region,
City = e.City
});
}
return result.ToArray();
}
public Employee GetEmployeeItem(int id)
{
NorthwindDataContext context = new NorthwindDataContext();
var e = context.Employees.FirstOrDefault(emp => emp.EmployeeID == id);
return new Employee
{
EmployeeID = e.EmployeeID,
FirstName = e.FirstName,
LastName = e.LastName,
Country = e.Country,
Region = e.Region,
City = e.City
};
}
}
}

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

【注意】当然,有可以通过调整WCF的binding的一些参数来让它可以传输更多数据量,那属于是WCF本身的技术。大家有兴趣可以参考一下

http://msdn.microsoft.com/en-us/library/system.servicemodel.basichttpbinding.maxbuffersize.aspx

总结:这一篇文章讲解了如何结合WCF技术实现应用程序集成设计。这是比直接访问数据库要灵活得多的一种方案。

如你所见,我在写这个文档的时候,估计暴露出来了一些错误的场景,这可以帮助大家更好地学习和掌握有关的技术。

MOSS 2010:Visual Studio 2010开发体验(22)——利用BCS和WCF进行应用程序集成相关推荐

  1. MOSS 2010:Visual Studio 2010开发体验(19)——ECMAScript Object Model

    这篇文章部分材料摘自下面这个地址,我做了翻译,并且按照我的案例场景做了补充 http://www.codeproject.com/Articles/60348/SharePoint-2010-Clie ...

  2. MOSS 2010:Visual Studio 2010开发体验(26)——工作流开发概述

    这一篇开始,我将介绍在MOSS 2010中进行工作流开发的最佳实践.这一篇主要介绍有关的几个概念 1.什么是工作流 工作流开发是这几年都比较火的一个领域.工作流,顾名思义就是工作的流程,而软件系统所要 ...

  3. MOSS 2010:Visual Studio 2010开发体验(15)——LINQ to SharePoint

    这一篇我们来讨论的是,如何通过LINQ的技术实现对SharePoint 2010列表的读取.我还记得当年.NET Framework 3.5发布,第一次接触到Linq的时候那种不可思议的感觉.现在,S ...

  4. MOSS 2010:Visual Studio 2010开发体验(16)——客户端对象模型

    转载自:http://www.cnblogs.com/chenxizhang/archive/2010/04/26/1721653.html 上一篇,我们讲到了LINQ to SharePoint.它 ...

  5. 关于在Office 2010,Visual Studio 2010环境下开发Office 2007解决方案的问题

    Office解决方案分应用级解决方案(application-level solution 也就是Add-in)和文档级解决方案(document-level solution包括Excel temp ...

  6. MOSS 2010:Visual Studio 2010开发体验(14)——列表开发之事件接收器

    通过前面几篇,我们已经完成了内容类型,列表定义,列表实例的开发.本篇继续讲解列表中的一个重要环节--事件接收器开发. 我们的场景是:我希望之前做好的订单列表这个内容类型自动地具有某些事件特征,例如当用 ...

  7. Visual Studio 2010 美女与程序员的爱情网剧+《耀和你一起》壁纸包

    微软这次给 Visual Studio 2010 做的广告转向了美女+感情的套路,特意为产品拍了一套爱情短剧视频,讲述美女与程序员的爱情,这给无数本来就是单身宅男的程序员们提供了不少YY的空间. 在爱 ...

  8. ASP.NET 4 和 Visual Studio 2010 Web 开发概述

    声明:本文是ASP.NET 白皮书 ASP.NET 4 and Visual Studio 2010 Web Development Overview 的阅读摘要,只是本人的学习记录,并非完整翻译,仅 ...

  9. Visual Studio 2010 旗舰版免序列号安装体验

    Visual Studio 2010 E文版已经发布多时,由于工作原因没有及早的下载体验,直到前几天园子里的朋友放出了下载简体中文的种子 ed2k://|file|cn_visual_studio_2 ...

最新文章

  1. 技术图文:如何在leetcode上进行算法刻意练习?
  2. MSSQL扫盲系列(4)-系统函数
  3. 1x pcie 速度_在主板规格上,x8在“1 x PCIe 3.0 x16(x8带宽)”中的含义是什么?...
  4. 线性表ArrayList和LinkedList源码详解。
  5. beangle commons 4.0.0 release
  6. 细讲 | Attention Is All You Need
  7. 【转载】IIS网站配置不带www域名直接跳转带www的域名
  8. spring mvc + freemarker 整合
  9. 计算机专业英语第五章ppt,计算机专业英语第五章.ppt
  10. ReportViewer教程(15)-矩阵报表-4
  11. 为什么vacuum后表还是继续膨胀?
  12. python怎么读取excel-python 读取 Excel
  13. 让.net 2.0支持并行计算
  14. 如何在搜狗高速浏览器设置代理IP
  15. 怎么使用quicktime
  16. 【设计模式】—-(12)代理模式(结构型)
  17. 使用终端生成icns,icon文件
  18. “中国315电子商务诚信平台”正式启动
  19. 无人机姿态解算_扩展卡尔曼滤波(2)
  20. three.js开发全景视频播放器的现实方法

热门文章

  1. 【DIY Arduino基于RC气垫船】
  2. 入职字节跳动那一天,我哭了(蘑菇街被裁,奋战7个月拿下offer)
  3. 小米隐私合规检测之违规收集IP地址
  4. 论文阅读 - MoCo
  5. 博科光纤交换机6510电源坏了怎么办
  6. 01、JavaWeb-IDEA2021版本的Tomcat工程创建
  7. 亚马逊上如何和卖家沟通
  8. 四.项目可行性研究分析/项目论证及评估
  9. 辣鸡(ljh) NOIP模拟赛 模拟 平面几何 数论 化学相关(雾)
  10. 配置与管理Web和FTP服务器