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。
我有一个简单的 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。