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

本文关键字:Server SQL 程序集 存储 net tcp 服务 WCF | 更新日期: 2023-09-27 18:36:48

我有一个简单的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 目录中找不到程序集系统.运行时.序列化

在添加程序集之前,我运行:

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

如 MSDN 中所述,SQL Server 不支持system.runtime.serialization

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

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

SQLCLR被设计为在原始SQL中嵌入复杂存储过程/函数/触发器等的替代方案。

它不是为承载功能齐全的 .NET 运行时而设计的。

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

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

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

如果要将数据发送到其他SQL Server实例,则可以使用Service Broker。