WCF Data Service与net.tcp承载分析
2010-10-25 20:45
274 查看
今天WCFDataService部署在支持net.tcp的IIS站点上时会出现问题,通过分析和查找相关资料有了一些结论。
http://www.rajneeshnoonia.com/blog/2009/12/ria-wcf-configuration-finally-resolved/这个是在VS2008下的早期版本正常,新的VS2010不可用
<serviceHostingEnvironmentaspNetCompatibilityEnabled="true"/>
可见IIS的运行采用的就不是WAS形式,而是和Asp.net混合的形式,这种情况下,需要支持net.tcp的WCF服务无法在IIS中承载如何查看已有的绑定的Endpoint的配置信息:
然后设置svc中的服务承载:
在VS跟踪器中可以查看到Endpoint和其对应的ABC信息,当然我们在这修改一些BehaviorBinding等信息以改变默认的行为,以实现定制,而且定制也仅限于此,如果想进行Endpoint的定制那就比较复杂了,见下一节。
以上把断点设置在Debug.WriteLine可以跟踪看到默认实现的DataServiceHost的绑定和契约如下
Binding:WebHttpBinding
Contract:System.Data.Services.IRequestHandler
如果部署在IIS中,只要IIS支持net.tcp,就会出现如下错误
TheprovidedURIscheme'net.tcp'isinvalid;expected'http'.Parametername:context.ListenUriBaseAddress
WCFDataService的默认实现的是不支持TCP的,不过Silverlight4已经可以支持tcp协议,因此增加这个形式的支持看来也是必要的,下一个版本不知能否增加。
实际中为什么需要TCP
假如我们在既支持远程又支持局域网环境下时下了WCFService,同时又想类似WCFDataService公布一个数据服务【这样对于数据的操作符等语法和WCFDataService一致,那我们对于服务接口可以简化很多,不用自己反复写了,否则WCF的查询和操作方法都要定义】,那tcp对于局域网是更好的选择
分析已有的组件可以更清楚如何去做:
System.Data.Services.dll:包含了服务的承载和默认的Endpoint和属性加入以及实现HTTP请求处理的HTTPModule,这样就实现了请求上来的HTTP请求自动跳转到服务上,同时默认实现的一些查询等可以直接使用
如上,两者配合实现客户端可定制的各种查询和操作同时服务端通过一个框架支持,不用再编写重复的代码了。支持net.tcp也就是在这些基础库上增加一个Endpoint,虽然是使用reflector可以看到大概,不过要实现估计还是比较大的工作量,如果自己写个框架,那可以按照以上两个组件的思路处理就可以实现WCFDataService形式的服务,不过这个是一个框架的活,希望在下一版本的WCFDataService能提供这样的支持。
以上的跟踪为了清楚的看到客户端端代理在LINQ基础上传递的HTTP请求,可以使用HttpAnalyzer或其他工具查看详细信息
现有的软件如何做
对于既部署了tcp形式的wcf服务又想使用WCFDataService的项目一个常见的可能解决方法:
将TCP服务和http协议的服务部署在IIS中的一个根应用下
将wcfdataservice部署在该根下的一个子应用下
参考:
http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/d6388487-27c1-4023-9825-71fb50596a8f
默认的绑定和查看
框架默认支持的绑定在web.config设置了<serviceHostingEnvironmentaspNetCompatibilityEnabled="true"/>
在服务类中设置了[AspNetCompatibilityRequirements(RequirementsMode=
AspNetCompatibilityRequirementsMode.Allowed)]
可见IIS的运行采用的就不是WAS形式,而是和Asp.net混合的形式,这种情况下,需要支持net.tcp的WCF服务无法在IIS中承载如何查看已有的绑定的Endpoint的配置信息:
默认的服务是由DataServiceHostFactory管理的,*.svc的文件中可以看到,此时我们可以继承该类然后就可以查看或修改
默认的配置
//System.Data.Services.DataServiceHostFactory,System.Data.Services
publicclassMyDataHostFactory:DataServiceHostFactory
{
protectedoverrideSystem.ServiceModel.ServiceHostCreateServiceHost(TypeserviceType,Uri[]
baseAddresses)
{
returnnewMyDataServiceHost(serviceType,baseAddresses);
}
}
publicclassMyDataServiceHost:DataServiceHost
{
//Usertoaddcustomlogichereasdesired
publicMyDataServiceHost(TypedomainServiceType,paramsUri[]baseAddresses)
:base(domainServiceType,baseAddresses)
{
Debug.WriteLine("datasvc");
}
}
[AttributeUsage(AttributeTargets.Class)]
publicclassMyServiceBehaviorAttribute:Attribute,IServiceBehavior
{
publicvoidAddBindingParameters(ServiceDescriptionserviceDescription,ServiceHostBaseserviceHostBase,
Collection<ServiceEndpoint>endpoints,BindingParameterCollectionbindingParameters)
{
}
publicvoidApplyDispatchBehavior(ServiceDescriptionserviceDescription,ServiceHostBaseserviceHostBase)
{
foreach(ServiceEndpointendpointinserviceHostBase.Description.Endpoints)
{
foreach(OperationDescriptionoperationinendpoint.Contract.Operations)
{
Debug.WriteLine(operation.Name);
}
}
}
publicvoidValidate(ServiceDescriptionserviceDescription,ServiceHostBaseserviceHostBase)
{
}
}
[MyServiceBehavior]
publicclassNorthWindService:DataService<NorthwindEntities>
然后设置svc中的服务承载:
<%@ServiceHostLanguage="C#"Factory="DataServices.Web.Services.MyDataHostFactory"
Service="DataServices.Web.Services.NorthWindService"%>
在VS跟踪器中可以查看到Endpoint和其对应的ABC信息,当然我们在这修改一些BehaviorBinding等信息以改变默认的行为,以实现定制,而且定制也仅限于此,如果想进行Endpoint的定制那就比较复杂了,见下一节。
以上把断点设置在Debug.WriteLine可以跟踪看到默认实现的DataServiceHost的绑定和契约如下
Binding:WebHttpBinding
Contract:System.Data.Services.IRequestHandler
实现net.tcp分析
错误现象如果部署在IIS中,只要IIS支持net.tcp,就会出现如下错误
TheprovidedURIscheme'net.tcp'isinvalid;expected'http'.Parametername:context.ListenUriBaseAddress
WCFDataService的默认实现的是不支持TCP的,不过Silverlight4已经可以支持tcp协议,因此增加这个形式的支持看来也是必要的,下一个版本不知能否增加。
实际中为什么需要TCP
假如我们在既支持远程又支持局域网环境下时下了WCFService,同时又想类似WCFDataService公布一个数据服务【这样对于数据的操作符等语法和WCFDataService一致,那我们对于服务接口可以简化很多,不用自己反复写了,否则WCF的查询和操作方法都要定义】,那tcp对于局域网是更好的选择
分析已有的组件可以更清楚如何去做:
System.Data.Services.dll:包含了服务的承载和默认的Endpoint和属性加入以及实现HTTP请求处理的HTTPModule,这样就实现了请求上来的HTTP请求自动跳转到服务上,同时默认实现的一些查询等可以直接使用
System.Data.Services.Client.dll:负责客户端代理的linq查询和其他操作合成成符合WCFDataService形式的请求发到服务端
其中一个关键类System.Data.Services.Client.DataServiceContext
如上,两者配合实现客户端可定制的各种查询和操作同时服务端通过一个框架支持,不用再编写重复的代码了。支持net.tcp也就是在这些基础库上增加一个Endpoint,虽然是使用reflector可以看到大概,不过要实现估计还是比较大的工作量,如果自己写个框架,那可以按照以上两个组件的思路处理就可以实现WCFDataService形式的服务,不过这个是一个框架的活,希望在下一版本的WCFDataService能提供这样的支持。
以上的跟踪为了清楚的看到客户端端代理在LINQ基础上传递的HTTP请求,可以使用HttpAnalyzer或其他工具查看详细信息
现有的软件如何做
对于既部署了tcp形式的wcf服务又想使用WCFDataService的项目一个常见的可能解决方法:
将TCP服务和http协议的服务部署在IIS中的一个根应用下
将wcfdataservice部署在该根下的一个子应用下
参考:
相关文章推荐
- WCF Data Service安全分析和说明
- 如何在IIS中承载WCF NetTcpBinding 服务
- WCF NetTcp AsyncQueue Service
- ADO.NET 4 快速上手(11)——WCF Data Service提供基于REST的服务(完)
- 在IIS7下利用net.tcp承载WCF
- Hosting WCF Service with netTcpBinding in Windows Service
- 【WCF】无法连接到 net.tcp://IP:端口/Service。连接尝试持续了 00:00:01.0840620 时间跨度。TCP 错误代码 10061: 由于目标计算机积极拒绝,无法连接。
- WCF学习问题之“net.tcp://localhost/service/”不支持正在使用的 .Net 组帧模式。有关详细信息,请参见服务器日志。
- net.tcp协议的wcf服务在远程计算机无法调用问题分析
- 再谈谈ADO.NET Data Service 数据格式(xml和json)
- Smark.Net.Tcp.XmlService性能测试程序
- MOSS 2010:Visual Studio 2010开发体验(20)——使用ADO.NET Data Service快速访问SharePoint列表数据
- ADO.net Data Service 分页解决方案
- 使用NetTcpBinding,WCF服务未能被激活
- ASP.NET MVC 学习 --- 第三课 (创建一个WCF Service)
- WCF安全系列(三) - netTCPBinding绑定之Message安全模式
- WCF .net Tcp 错误异常
- ASP.NET4.0 Ajax实例 –Javascript调用 ADO.NET Data Service实现数据库操作
- 精进不休 .NET 4.5 (11) - ADO.NET Entity Framework 5.0 新特性, WCF Data Services 5.0 新特性(OData V3)
- Entity Framework4.0 (九EF4与WCF Data Service的结合使用(转)