WCF Data Service与net.tcp承载分析

今天WCF Data Service部署在支持net.tcp的IIS站点上时会出现问题,通过分析和查找相关资料有了一些结论。

http://www.rajneeshnoonia.com/blog/2009/12/ria-wcf-configuration-finally-resolved/ 这个是在VS2008下的早期版本正常,新的VS2010不可用

默认的绑定和查看

框架默认支持的绑定在web.config设置了

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

在服务类中设置了[AspNetCompatibilityRequirements(RequirementsMode = 
AspNetCompatibilityRequirementsMode.Allowed)]

可见IIS的运行采用的就不是WAS形式,而是和Asp.net混合的形式,这种情况下,需要支持net.tcp的WCF服务无法在IIS中承载如何查看已有的绑定的Endpoint的配置信息:

默认的服务是由DataServiceHostFactory管理的,*.svc的文件中可以看到,此时我们可以继承该类然后就可以查看或修改
默认的配置
 //System.Data.Services.DataServiceHostFactory, System.Data.Services
       public class MyDataHostFactory : DataServiceHostFactory
       {
       protected override System.ServiceModel.ServiceHost CreateServiceHost(Type serviceType,Uri[] 
baseAddresses)
              {
                    return new MyDataServiceHost(serviceType, baseAddresses);
              }
       }
 
       public class MyDataServiceHost : DataServiceHost
       {
              //User to add custom logic here as desired
              public MyDataServiceHost(Type domainServiceType, params Uri[] baseAddresses)
                    : base(domainServiceType, baseAddresses)
              {
                    Debug.WriteLine("data svc");
              }
       }
       [AttributeUsage(AttributeTargets.Class)]
       public class MyServiceBehaviorAttribute : Attribute, IServiceBehavior
       {
       public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, 
Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
              {
              }
 
       public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
              {
                     foreach (ServiceEndpoint endpoint in serviceHostBase.Description.Endpoints)
                    {
                           foreach (OperationDescription operation in endpoint.Contract.Operations)
                           {
                                  Debug.WriteLine(operation.Name);
                           }
                    }
              }
 
       public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
              {
              }
       }
       
       [MyServiceBehavior]
    public class NorthWindService : DataService< NorthwindEntities >
 

然后设置svc中的服务承载:

<%@ ServiceHost Language="C#" Factory="DataServices.Web.Services.MyDataHostFactory" 
Service="DataServices.Web.Services.NorthWindService" %>

在VS跟踪器中可以查看到Endpoint和其对应的ABC信息,当然我们在这修改一些Behavior Binding等信息以改变默认的行为,以实现定制,而且定制也仅限于此,如果想进行Endpoint的定制那就比较复杂了,见下一节。

以上把断点设置在Debug.WriteLine可以跟踪看到默认实现的DataServiceHost的绑定和契约如下

Binding : WebHttpBinding

Contract: System.Data.Services.IRequestHandler

实现net.tcp分析

错误现象

如果部署在IIS中,只要IIS支持net.tcp,就会出现如下错误

The provided URI scheme 'net.tcp' is invalid; expected 'http'. Parameter name: context.ListenUriBaseAddress

WCF DataService的默认实现的是不支持TCP的,不过Silverlight4已经可以支持tcp协议,因此增加这个形式的支持看来也是必要的,下一个版本不知能否增加。

实际中为什么需要TCP

假如我们在既支持远程又支持局域网环境下时下了WCF Service,同时又想类似WCF Data Service公布一个数据服务【这样对于数据的操作符等语法和WCF Data Service一致,那我们对于服务接口可以简化很多,不用自己反复写了,否则WCF 的查询和操作方法都要定义】,那tcp对于局域网是 更好的选择

分析已有的组件可以更清楚如何去做:

System.Data.Services.dll: 包含了服务的承载和默认的Endpoint和属性加入以及实现HTTP请求处理的HTTPModule,这样就实现了请求上来的HTTP请求自动跳转到服务上,同时默认实现的一些查询等可以直接使用

System.Data.Services.Client.dll: 负责客户端代理的linq查询和其他操作合成成符合WCF Data Service形式的请求发到服务端
其中一个关键类System.Data.Services.Client.DataServiceContext

如上,两者配合实现客户端可定制的各种查询和操作同时服务端通过一个框架支持,不用再编写重复的代码了。支持net.tcp也就是在这些基础库上增加一个Endpoint,虽然是使用reflector可以看到大概,不过要实现估计还是比较大的工作量,如果自己写个框架,那可以按照以上两个组件的思路处理就可以实现WCF Data Service形式的服务,不过这个是一个框架的活,希望在下一版本的WCF Data Service能提供这样的支持。

以上的跟踪为了清楚的看到客户端端代理在LINQ基础上传递的HTTP请求,可以使用Http Analyzer或其他工具查看详细信息

现有的软件如何做

对于既部署了tcp形式的wcf服务又想使用WCF Data Service的项目一个常见的可能解决方法:

将TCP服务和http协议的服务部署在IIS中的一个根应用下

将wcf data service部署在该根下的一个子应用下

参考:

http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/d6388487-27c1-4023-9825-71fb50596a8f

时间: 2025-01-29 19:52:36

WCF Data Service与net.tcp承载分析的相关文章

WCF Data Service的实例

为了打通客户端.网络.手机端等的数据平台,研究了八天的 REST接口架构. 首先是 WCF REST,了解了REST以及WCF REST.详细理论知识WCF REST ----理论准备工作 其次是实际应用,使用WCF Data Service,详细理论知识WCF Data Service ----理论准备 建立WCF Data Service网上包括MSDN都有很多实例. 第一步,建立一个Web应用程序 第二步,添加一个ADO.NET实体数据模型,如下图: 然后建立实体模型数据,连接相应的数据库

WCF Data Service使用总结(二) 使用WCF Data Service 创建OData服务

在 上一章 中,介绍了如何通过 OData 协议来访问 OData 服务提供的资源.下面来介绍如何创建一个 OData 服务.在这篇文章中,主要说明在.NET的环境下,如何使用 WCF Data Service 来创建OData服务.当然,对于 JAVA 或者其它平台,也是可以创建 OData 服务的.甚至是数据库,都可以提供 OData 服务. WCF Data Service 是需要 ORM 的支持的,当然,主流的 ORM 都已经支持 WCF Data Service 了,包括(但不限于)

WCF Data Service使用总结 (一)了解OData协议

最近做了一个小项目,其中用到了 WCF Data Service,之前是叫 ADO.NET Data Service 的.关于WCF Data Service,博客园里的介绍并不多,但它确实是个很好的框架.可以很方便地通HTTP来访问数据库,如果你是做富客户端开发的,用它绝对能大大减少你的工作量.出于对这个框架的喜爱,于是把自己的一些使用经验写下来,并且希望有更多的人能够用上. OData简介 说起 WCF Data Service ,不得不说的是 OData.对于一个标准的 Web 服务,它往

WCF Data Service工具包

WCF Data Service工具包是一组WCF Data Service(OData的.NET实现),目的是使更容易地构建WCF Data Service,支持数据的任何存储上的OData服务而不需要深入的理解Linq,当然了,深入的理解Linq的非常必要的. 它诞生于现实的一些服务,诸如Netflix, eBay, Facebook, Twitpic等等公司的公开的服务,这个工具包已经在现有的产品中使用,被证明解决了一些有趣的问题,而且在工作中发挥了很大的作用. 在使用这个工具包之前需要知

WCF Data Service安全分析和说明

首先需要知道服务运行在asp.net的承载环境中,具体参考: http://blogs.msdn.com/b/wenlong/archive/2006/01/23/516041.aspx 关于安全有个详细的参考地址: http://blogs.msdn.com/b/astoriateam/archive/tags/authentication/ 讲述了涉及安全各个方面,是个很好的资料 本文就从常见的涉及安全的几个方面进行分析和说明 服务端安全 由于服务承载在IIS中,因此可以使用Asp.net的

EntityFramework 5.0 + WCF Data Service 访问数据集时报错

问题描述 EntityFramework5.0+WCFDataService访问数据集的时候提示访问http://localhost/WcfService1/NorthwindService.svc正常访问http://localhost/WcfService1/NorthwindService.svc/Products则报错,查看跟踪文件提示无法将通信对象System.ServiceModel.Channels.TransportReplyChannelAcceptor+TransportRe

WCF Data Service Publish to IIS 7 Get 404

问题描述 大家好,我的环境是Window7IIS7VS2010.net4.0根据msdn的StepbyStep,制作了WCFDataService直接运行完全正常,可以访问http://localhost:xxx/service.svc可用IE9访问并且,此Service可以被Client引用但当我发布到IIS7后在IE9中访问http://localhost/service.svc得到的报错如下ServerErrorin'/'Application.----------------------

WCF Data Services实例:ASP.net AJAX访问

本文参考 Code.msdn的例子,在此基础上实现了一个参考例子,代码放在了: http://dskit.codeplex.com 如果想在Asp.net MVC应用以JavaScript中访问WCF Data Service服务,以下是使用Microsoft AJAX Library库进行处理的例子 var dataContext; var queryObject, queryObject1; Sys.require([Sys.components.dataView, Sys.componen

WCF Data Services查询

上一篇文章http://www.cnblogs.com/2018/archive/2010/10/15/1852579.html介绍了WCF Data Service的基础知识,下面介绍一下查询 查询在WCF Data Services十分的方便,更强的功能在这些类别中可以看到WCF Data Service的超级威力.可以直接在浏览器中输入查询表达式等进行访问 直接使用例子可从http://dskit.codeplex.com下载 查询表达式Query Expressions 一般的查询表达式