Я понимаю, что это довольно старый вопрос, но на него все же стоит ответить.Как уже упоминалось, именованные каналы являются самыми быстрыми, и вам необходимо отключить защиту, но наиболее существенный эффект вы получите, если избавитесь от сериализации контракта данных и переключитесь в режим потоковой передачи.
Используйте что-то вроде этого в качестве конфигурации привязки:
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.
Не забудьте передать ParametersLen / ResultsLen в заголовке сообщения, так как Stream бесконечен (при чтении вы можете получить 0 байтов, но в отличие от обычных потоков вы должны продолжитьчтение).