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
。
在这种情况下,如何将程序集添加到数据库?
SQLCLR被设计为在原始SQL中嵌入复杂存储过程/函数/触发器等的替代方案。
它不是为承载功能齐全的 .NET 运行时而设计的。
它当然不是为了执行打开本地 tcp 套接字并尝试将数据传输到某个地方的代码而设计的。
即使你能做到这一点,在我看来你也不应该这样做。有些问题应该彼此分开,这是一个例子。很抱歉,如果这听起来是规范性的,但我有同时使用 SQLCLR 和 WCF 的经验,我很难想到将它们组合到堆栈中的同一层中的任何好处。
如果需要从 SQL 数据库集成到 .net 代码,还有其他选项,例如 SqlDependency。这将允许你通过侦听数据库更改来触发来自 .net 代码的服务调用。
如果要将数据发送到其他SQL Server实例,则可以使用Service Broker。