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 中的存储程序集的主要内容,如果未能解决你的问题,请参考以下文章

WCF Net.tcp 仅在本地失败

域服务器和域外客户端中的 net.tcp wcf 服务(托管 Windows 服务)

WCF net.tcp - 目标机器拒绝连接

在 WCF 的添加服务引用中找不到 net.tcp 端点?

奇怪的 WCF net.tcp 异常

如何使用来自远程服务器的 net.tcp 端点 ping 或检查 WCF 服务的状态?