Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF-最快的进程间通信_C#_Wcf_Named Pipes - Fatal编程技术网

C# WCF-最快的进程间通信

C# WCF-最快的进程间通信,c#,wcf,named-pipes,C#,Wcf,Named Pipes,A有一个web可访问(通过basicHttpBinding)WCF服务,我还希望从同一台机器上的其他.NET服务访问该服务,并尽可能提高性能。我知道netNamedPipeBinding非常适合这样做,但我想知道,如果我只打算与其他.NET进程通信,那么会给出什么样的最佳配置 例如,我不必使用像SOAP这样的编码,因为这可能太庞大了,并且我不需要与.NET客户机以外的任何其他客户机兼容。我也不认为我需要任何安全措施 为此目的(或任何其他相关配置)的最佳绑定配置是什么?如您所述,该绑定针对同一机器

A有一个web可访问(通过basicHttpBinding)WCF服务,我还希望从同一台机器上的其他.NET服务访问该服务,并尽可能提高性能。我知道netNamedPipeBinding非常适合这样做,但我想知道,如果我只打算与其他.NET进程通信,那么会给出什么样的最佳配置

例如,我不必使用像SOAP这样的编码,因为这可能太庞大了,并且我不需要与.NET客户机以外的任何其他客户机兼容。我也不认为我需要任何安全措施

为此目的(或任何其他相关配置)的最佳绑定配置是什么?

如您所述,该绑定针对同一机器通信进行了优化:

提供安全可靠的绑定 这是优化的机器上 沟通

参考号:

在Juval Lowy的书《编程WCF服务》的第一章中,他提供了一个有用的决策活动图,用于选择正确的绑定:

“你应该问的第一个问题 你自己决定你的服务是否需要 与非WCF客户端交互。如果 答案是肯定的,如果客户 如果是旧版MSMQ客户端,请选择 支持 您的服务将通过MSMQ进行互操作 有这样一个客户如果你需要 与非WCF客户端和 该客户机需要基本的web服务 协议(ASMX web服务),选择 BasicHttpBinding,它公开 您对外提供的WCF服务 就好像它是一个ASMX web服务一样 (即WSI基本配置文件) 缺点是你不能接受 大多数现代WS的优势-* 协议。但是,如果非WCF 客户可以理解这些标准, 选择一个WS绑定,例如 WSHttpBinding, WSFederationHttpBinding,或 WSDualHttpBinding。如果您可以假设 客户机是否是WCF客户机 它需要脱机或断开连接 交互时,选择NetMsmqBinding 它使用MSMQ传输数据 消息。如果客户端需要 连接通信,但可能是 跨越机器边界呼叫, 选择要使用的网络绑定 通过TCP进行通信。如果客户端 与服务在同一台机器上, 选择要使用的NetNamedPipeBinding 使用命名管道最大化 性能。您可以微调绑定 基于附加值的选择 标准,如是否需要 回调(WSDualHttpBinding)或 联邦安全 (WSFederationHttpBinding)。”


当然,命名管道传输是最佳选择

默认情况下,在标准NetNamedPipeBinding上启用EncryptAndSign传输安全。您当然希望删除它,因为这样做会加快速度,而不会对安全性产生任何实际影响,原因如下


我还怀疑,但尚未确认,更改消息编码绑定元素可能会有所帮助。这是因为默认值是WCF专有的“带内字典的二进制编码”,这是一种XML信息集的编码,旨在减少冗余字节,例如在打开和关闭元素标记中:当涉及网络IO时,这是一个值得追求的目标,但当消息传输完全在内存中时,可能会浪费CPU的精力(如果消息不太大)。因此,更改为纯文本编码也可能会提高速度。

我知道这是一个非常老的问题,但仍然值得回答。正如前面提到的,命名管道速度最快,需要禁用安全性,但如果您放弃数据协定序列化并切换到流媒体,则会产生最显著的效果sed传输模式

使用类似以下内容作为绑定配置:

                new NetNamedPipeBinding
                {
                    MaxReceivedMessageSize     = 524288000,
                    ReceiveTimeout             = TimeSpan.MaxValue, // never timeout
                    SendTimeout                = TimeSpan.MaxValue, // never timeout
                    ReaderQuotas               =
                    {
                        MaxStringContentLength = 655360000
                    },
                    TransferMode               = TransferMode.Streamed,
                    Security = new NetNamedPipeSecurity
                    {
                        Mode = NetNamedPipeSecurityMode.None,
                        Transport = new NamedPipeTransportSecurity
                        {
                            ProtectionLevel = ProtectionLevel.None
                        }
                    }
                }
按如下方式定义您的服务消息:

[MessageContract]
public class CallRequestMessage
{
    [MessageHeader]
    public string Arg1;
    [MessageHeader]
    public int ParametersLen;
    [MessageBodyMember]
    public Stream Parameters;
}

[MessageContract]
public class CallResponceMessage
{
    [MessageHeader]
    public int ResultCode;
    [MessageHeader]
    public int ResultsLen;
    [MessageBodyMember]
    public Stream Results;
}

[ServiceContract]
public interface ILocalServiceAPI
{
    [OperationContract]
    CallResponceMessage Call(CallRequestMessage message);
}
这种方法的缺点是,现在您必须自己序列化数据。我更喜欢直接使用protobuf序列化来实现MemoryStream。将此流放入CallRequestMessage.Parameters


不要忘记在消息头中传输参数slen/ResultsLen,因为流是无止境的(读取时,您可能会收到0字节,但与正常流不同,您应该继续读取).

感谢您的回复,但如果有任何改进,我希望对绑定进行“微调”。例如,我认为默认情况下启用了安全性-我可以禁用它并节省一点开销。我假设使用了SOAP编码,但可能二进制会加快速度。也许可以使用更快的自定义编码?有吗关于优化绑定的建议将不胜感激。你似乎在说你想“微调”绑定”在您确定需要之前。您能解释一下为什么需要此性能以及您为确定此需求所做的工作吗?我已经测试了性能,发现使用HTTP、命名管道并在同一应用程序上执行的1000次操作迭代花费了:服务(HTTP):5192ms,服务(命名管道):4646ms,应用程序:2971ms。我可以接受它会更慢,但我希望NamedPipe绑定更接近应用程序速度(本地运行相同的操作)比HTTP速度快。啊-为什么?它仍然需要序列化。想要调整它-使用PROTOBUF作为序列化协议。比MS的XML/二进制快得多。可下载的soruces可通过谷歌下载。链接已失效。你能更新或发布相关信息吗?你的回答非常有帮助,我很乐意看到其他信息。