WCF net.tcp 服务和存储程序集在 SQL 服务器中

WCF net.tcp service and stored assembly in SQL Server

我有一个简单的 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)时,我收到如下错误:

assembly system.runtime.serialization was not found in the sql catalog

在添加程序集之前 运行:

ALTER DATABASE DBNAME SET TRUSTWORTHY ON
ALTER AUTHORIZATION ON DATABASE::DBNAME TO SYSTEM_USER

MSDN 中所述 system.runtime.serialization 在 SQL 服务器中不受支持。

在这种情况下,如何将程序集添加到数据库中?

SQLCLR 被设计为在原始 SQL 中实现复杂存储 procedures/functions/triggers 等的替代方案。

它不是为托管功能齐全的 .net 运行时而设计的。

它当然不是设计用来执行打开本地 tcp 套接字并尝试将数据传输到某个地方的代码。

即使你可以做到这一点,我认为你也不应该这样做。有些问题应该彼此分开,这就是一个例子。抱歉,如果这听起来很规范,但我有使用 SQLCLR 和 WCF 的经验,我很难想到将它们组合到堆栈中的同一层有什么好处。

如果您需要从 SQL 数据库集成到 .net 代码,还有其他选项,例如 SqlDependency。这将允许您通过侦听数据库更改来触发来自 .net 代码的服务调用。

如果您想将数据发送到其他 SQL 个服务器实例,则有 Service Broker