WCF net.tcp 服务和 SQL Server 中的存储程序集
Posted
技术标签:
【中文标题】WCF net.tcp 服务和 SQL Server 中的存储程序集【英文标题】:WCF net.tcp service and stored assembly in SQL Server 【发布时间】:2016-06-13 19:22:51 【问题描述】:我有一个简单的 WCF 服务客户端,它使用 net.tcp
协议。此客户端应作为存储程序集添加到数据库中。
来自服务配置:
<service name="ServiceDocument.DocService" behaviorConfiguration="TCPServiceBehavior">
<endpoint name="DocServiceTCP" address="net.tcp://localhost:5430/DocService" binding="netTcpBinding" bindingConfiguration="netTcpConfig" contract="ServiceDoc.IDocService"/>
<endpoint name="DocServiceMex" address="net.tcp://localhost:5431/mexDocService" binding="mexTcpBinding" contract="IMetadataExchange"/>
</service>
我添加到客户端服务参考使用地址net.tcp://localhost:5431/mexDocService
,然后客户端工作正常。
服务参考生成的代码如下:
namespace DocContent.DocServiceTCP
using System.Runtime.Serialization;
using System;
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="Document", Namespace="http://schemas.datacontract.org/2004/07/ServiceDoc")]
[System.SerializableAttribute()]
public partial class Document
....
但是当我尝试将此客户端作为存储程序集添加到数据库中(使用 SMSS)时,我收到如下错误:
在 sql 目录中找不到程序集 system.runtime.serialization
在添加程序集之前我运行:
ALTER DATABASE DBNAME SET TRUSTWORTHY ON
ALTER AUTHORIZATION ON DATABASE::DBNAME TO SYSTEM_USER
如MSDN 中所述,SQL Server 不支持system.runtime.serialization
。
在这种情况下如何将程序集添加到数据库中?
【问题讨论】:
【参考方案1】:SQLCLR 旨在替代在原始 SQL 中实现复杂的存储过程/函数/触发器等。
它不是为托管全功能的 .net 运行时而设计的。
它当然不是为执行打开本地 tcp 套接字并尝试将数据传输到某个地方的代码而设计的。
即使你能做到这一点,在我看来你也不应该这样做。一些关注点应该彼此分开,这就是一个例子。抱歉,如果这听起来很规范,但我有使用 SQLCLR 和 WCF 的经验,我很难想出将它们组合到堆栈中的同一层的任何好处。
如果您需要从 SQL 数据库集成到 .net 代码,还有其他选项,例如 SqlDependency。这将允许您通过侦听数据库更改从 .net 代码触发服务调用。
如果您想将数据发送到其他 SQL 服务器实例,则有 Service Broker。
【讨论】:
感谢您的回答。当我在客户端使用 Web 引用时,我可以添加程序集。所以,我认为服务引用也应该作为程序集导入。我将阅读有关 SqlDependency 和 Broker 的内容。谢谢 @MegaTron 您是正确的,因为可以将服务引用编译成程序集并添加。当您将程序集添加到 SQLCLR 时,会读取 dll 清单并在添加程序集之前检查所有依赖项。如您所见,服务引用取决于 System.Runtime.Serialization。 SQL 不需要依赖这个程序集,也不应该。以上是关于WCF net.tcp 服务和 SQL Server 中的存储程序集的主要内容,如果未能解决你的问题,请参考以下文章