WCF 创造WCF

一、概述

[翻译]何以利用表明式树生成动态查询

在LINQ,表明式树常用于结构化查询,目的资源数量实现了
IQueryable.
例如,LINQ为关系型数据存储查询提供了
IQueryable
接口。C#编译器将这一个数据源的查询编译成运行时的表明式树代码。然后查询提供程序可以遍历表明式树数据结构,并转账为适龄于数据源的询问语言。

在LINQ中选拔表明式树来代表分配给
Expression
类型的兰姆(Lamb)da表明式变量。

这节紧要描述了怎么着使用表达式树构建一个动态LINQ查询。在编译期,动态查询在十分未知的询问的状态下是特别管用的。具体事例,一个应用程序提供了一个用户接口,最终来允许用户指定一个或五个谓词来过滤数据。为了选择LINQ查询,这种景观应用程序在运转时必须利用表明式树来构建一个LINQ查询。

  Windows Communication
Foundation(WCF)是由微软前行的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一局部。由
.NET Framework 3.0 开端引入。

Example

上面这段代码显示什么利用表明式树去围绕 IQueryable
数据源构造一个询问并运行。代码生成了一个表达式树来代表查询:

companies.Where(company => (company.ToLower() == "coho winery" || company.Length > 16)).OrderBy(company => company)

在命名空间
[System.Linq.Expressions](https://docs.microsoft.com/en-us/dotnet/api/system.linq.expressions)
下有个厂子方法用来生成一个表达式树来表示那多少个查询。表示业内查询运算符方法调用的表明式将引用这个点子的
Queryable
的兑现。最终表明式树被传送给 IQueryable 数据源的提供程序的
CreateQuery(Expression)
实现,以创办一个可举行的 IQueryable
类型的询问。通过枚举该查询拿到结果。

Expression<Func<string, bool>> expr = name => name.Length > 10 && name.StartsWith("G");
Console.WriteLine(expr);

AndAlsoModifier treeModifier = new AndAlsoModifier();
Expression modifierExpr = treeModifier.Modify(expr);

Console.WriteLine(modifierExpr);

string[] companies = {"Consolidated Messenger", "Alpine Ski House", "Southridge Video", "City Power & Light",
        "Coho Winery", "Wide World Importers", "Graphic Design Institute", "Adventure Works",
        "Humongous Insurance", "Woodgrove Bank", "Margie's Travel", "Northwind Traders",
        "Blue Yonder Airlines", "Trey Research", "The Phone Company",
        "Wingtip Toys", "Lucerne Publishing", "Fourth Coffee" };
//转化IQueryable数据源
IQueryable<string> queryableData = companies.AsQueryable();
//编写表示谓词参数的表达式树
ParameterExpression pe = Expression.Parameter(typeof(string), "company");
//新建一个表达式树来表示 'company.ToLower() == "coho winery"' 的表达式
Expression left = Expression.Call(pe, typeof(string).GetMethod("ToLower", Type.EmptyTypes));
Expression right = Expression.Constant("coho winery", typeof(string));
Expression e1 = Expression.Equal(left, right);
//新建一个表达式树来表示 'company.Length > 16' 表达式
left = Expression.Property(pe, typeof(string).GetProperty("Length"));
right = Expression.Constant(16,typeof(int));
Expression e2 = Expression.GreaterThan(left, right);
//编译表达式树来生成一个表示'(company.ToLower() == "coho winery" || company.Length > 16)' 的表达式
Expression predicateBody = Expression.OrElse(e1, e2);
//新建一个表达式树来表示 'queryableData.Where(company => (company.ToLower() == "coho winery" || company.Length > 16))'
MethodCallExpression whereCallExpresstion = Expression.Call(
    typeof(Queryable),
    "Where",
    new Type[] { queryableData.ElementType },
    queryableData.Expression,
    Expression.Lambda<Func<string, bool>>(predicateBody, new ParameterExpression[] { pe }));

//排序 OrderBy(company => company)
//新建一个表达式树来表示 'whereCallExpression.OrderBy(company => company)'
MethodCallExpression orderCallExpresstion = Expression.Call(
    typeof(Queryable),
    "OrderBy",
    new Type[] { queryableData.ElementType, queryableData.ElementType },
    whereCallExpresstion,
    Expression.Lambda<Func<string, string>>(pe, new ParameterExpression[] { pe }));

//新建一个可执行的查询表达式树
IQueryable<string> result = queryableData.Provider.CreateQuery<string>(orderCallExpresstion);

//枚举结果
foreach (string company in companies)
    Console.WriteLine(company);

代码中在被传送到 Queryable.Where
方法中,在谓词中应用了一个一定数字。可是,你可以写一个应用程序,来编译在谓词中一个凭借于用户输入的数字变量。你也可以依据用户的输入,更改查询中调用的正经查询操作符。

  WCF的最后目的是通过进程或不同的系列、通过本地网络或是通过Internet收发客户和劳务期间的信息。

编译代码

  • 创建新的控制台应用程序项目。
  • 加上对 System.Core.dll 的引用(尽管没有引用)。
  • 包括 System.Linq.Expressions 命名空间。
  • 从示例中复制代码,并将其粘贴到 Main 方法中。

  WCF合并了Web服务、.net Remoting、音讯队列和Enterprise
Service(Service)s的成效并集成在Visual Studio中。

  WCF专门用于面向服务支付。

二、基于Asp.net 的应用程序开发与面向服务付出

图片 1

  在按照Asp.net
的应用程序开发中,大家由客户机的浏览器访问应用程序服务器,然后经过应用程序服务器中的数据库连接去老是数据库服务器,读取或是操作数据,有时候可能会多一个文书服务器。我们可以洞察到,基本上所有的运用都位于了一台服务器上,但对于一个,由于作业上的急需(如:与外部系统相互),一台服务器很难支撑所有的使用。我们再看下边的图:

图片 2

  客户机使用浏览器访问服务器A,服务器A为了工作需要与其他各类应用部署在劳务器B、C、D….再通过WCF技术并行通信,相互访问…然则面向服务的益处不仅仅在此,他还提供了不同语言不同操作系统的可互相性..由于本文不是介绍SOA的作品,感兴趣的校友可以参见:SOA

三、第一个WCF程序

  1.
新创建空白解决方案,并在缓解方案中新建项目,项目项目为:WCF服务应用程序。建立完成后如下图所示:

图片 3

  2.剔除系统生成的五个文件IService(Service)1.cs与瑟维斯(Service)1.svc。

  3.添加自定义的WCF【服务文件】User.svc,此时vs2010会自动生成WCF接口文件IUser.cs,大家在IUser中定义WCF方法ShowName,在User.svc.cs对该接口的不二法门开展落实。

代码如下:

using System.ServiceModel;

namespace WCFService
{
    [ServiceContract]
    public interface IUser
    {
        [OperationContract]
        string ShowName(string name);
    }
}


namespace WCFService
{
    public class User : IUser
    {
        public string ShowName(string name)
        {
            string wcfName = string.Format("WCF服务,显示姓名:{0}", name);
            return wcfName;
        }
    }
}

我们可以看出,在WCF中的接口与普通接口的区别只在乎三个上下文,其他的和我们健康学习的接口一样。定义那多少个上下文要添加System.Service(Service)Model的引用。

[ServiceContract],来验证接口是一个WCF的接口,即使不加的话,将无法被表面调用。

[OperationContract],来表明该方法是一个WCF接口的点子,不加的话同上。 

这儿我们的第一个WCF服务程序就建立好了,将User.svc“设为初始页”,然后F5运行一下试行,如下图所示,VS2010电动调用了WCF的客户端测试工具以便大家测试程序:

图片 4

  我们双击上图中的 ShowName() 方法,出现如下图:

图片 5

  在伸手窗口中的值中输入参数“你的姓名”,然后点击“调用”,在响应窗口中会出现重回值“WCF服务,显示姓名:你的真名”,表明测试成功,点击下面的XML也可以看看XML的数据传输。我们现在创造好了劳务的应用程序和事务逻辑,即相当简单的打印姓名的主意,测试也不负众望了。那么大家怎么用啊?

四、场景

  我们规划的场所是在生产中平时利用的场景,把WCF程序寄宿在IIS之上。假使场景如下:A服务器和B服务器。我们把我们刚刚确立的WCF程序“部署”在B服务器上(本学科的A,B服务器都放是自己要好的一台机器),大家的对象是在A服务器的应用程序来访问B服务器的WCF程序,实现服务器端的应用程序通讯。

五、将WCF程序寄宿在B服务器的IIS之上

  首先我们将WCF应用程序发表一下,然后部署在B服务器的IIS之上,如下图所示:

图片 6

  鼠标右键浏览Uesr.svc,在游览器中出现如下图所示,表达服务配置成功。

图片 7

   上图中的http://localhost/User.svc?wsdl即为我们要引用的劳动地点。

六、在客户端[A服务器]创制服务的引用

  大家这边以Web应用程序为例,建立地物理地址为本机,然则我们可以想像成B服务器是长途统计机,localhost为一个其他的IP地址。

  新建解决方案,并且创建ASP.NET
Web应用程序的项目。命名为:WCFClient,如下图所示:

 

图片 8

  (1)新建Asp.net页面,命名为:WcfTest.aspx。

  (2)添加在第五步中配备的劳动的引用。如下图所示:

图片 9

  此时弹出添加服务引用的窗体,如下图所示:

图片 10

  大家在地方里写上我们下榻在IIS上的WCF服务的地点服务路径,此处为:http://localhost/User.svc?wsdl,在名称空间处填写WCF瑟维斯(Service)[此称号空间要在底下的客户端中援引]然后点击“前往”–>“确定”按钮。此时大家成功了对劳务的引用。大家重新翻开解决方案,里面多了ServiceReferences的文书夹,通过资源管理器打开后其中多了些文件,这一个文件用于客户端向服务端的调用,现在先不用管他。

 七、使用WCF服务端的法子

  WcfTest.aspx的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

//引用WCF服务的名称空间
using WCFClient.WCFService;

namespace WCFClient
{
    public partial class WCFTest : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnClick(object sender, EventArgs e)
        {
            UserClient user = new UserClient();
            string result = user.ShowName(this.txtName.Text);
            Response.Write(result);
        }
    }
}

地方中的UserClient类是在添加引用的时候生成的劳动端User类的客户端代理类,一般客户端代理类名称都会是**Client。我们运行一下看下效果。

图片 11

  通过上述的例子,大家做到了由A服务器的使用向B服务器中WCF提供的点子的调用。这个例子相比简单,对于平时开发B/S结构应用程序的同校们来说相比好精晓。

八、说明:因为网上的入门教程相比较少,本课程只做入门,后边会持续讲些其余入门的事物,深切的请看园子里:Artech 堂哥的小说。

九、代码下载:

  10 WCF
教程

 

初稿链接:http://www.cnblogs.com/iamlilinfeng/archive/2012/09/25/2700049.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图