У меня есть следующий код
public bool StartWCF()
{
try
{
// Select the first entry. I hope it's this maschines IP
// IPAddress _ipAddress = ips.AddressList[0];
var ipAddress = new IPAddress(new byte[] { 127, 0, 0, 1 });
// Create the url that is needed to specify where the service should be started
this.m_UrlMetaServiceComm = "net.tcp://" + ipAddress + ":8000/VSMDBCommunication";
this.m_UrlMetaServicePart = "net.tcp://" + ipAddress + ":8000/VSMDBPartType";
string endPointAddrComm = this.m_UrlMetaServiceComm;
var tcpBindingComm = new NetTcpBinding
{
TransactionFlow = false,
MaxReceivedMessageSize = 20000000,
MaxBufferSize = 20000000,
MaxBufferPoolSize = 20000000,
ReaderQuotas = { MaxNameTableCharCount = 20000000 },
OpenTimeout = new TimeSpan(0, 5, 0),
SendTimeout = new TimeSpan(0, 5, 0),
CloseTimeout = new TimeSpan(0, 5, 0)
};
tcpBindingComm.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign;
tcpBindingComm.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
tcpBindingComm.Security.Mode = SecurityMode.None;
var endpointAddressComm = new EndpointAddress(endPointAddrComm);
this.m_ChannelCommunication = ChannelFactory<IVSMDBCommunication>.CreateChannel(
tcpBindingComm, endpointAddressComm);
((IContextChannel)m_ChannelCommunication).OperationTimeout = new TimeSpan(0, 5, 0);
string endPointAddrPart = this.m_UrlMetaServicePart;
var tcpBindingPart = new NetTcpBinding
{
TransactionFlow = false,
MaxReceivedMessageSize = 20000000,
MaxBufferSize = 20000000,
MaxBufferPoolSize = 20000000,
ReaderQuotas = { MaxNameTableCharCount = 20000000 },
OpenTimeout = new TimeSpan(0, 5, 0),
SendTimeout = new TimeSpan(0, 5, 0),
CloseTimeout = new TimeSpan(0, 5, 0)
};
tcpBindingPart.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign;
tcpBindingPart.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
tcpBindingPart.Security.Mode = SecurityMode.None;
var endpointAddressPart = new EndpointAddress(endPointAddrPart);
this.m_ChannelPartTypes = ChannelFactory<IVSMDBPartType>.CreateChannel(
tcpBindingPart, endpointAddressPart);
((IContextChannel)m_ChannelPartTypes).OperationTimeout = new TimeSpan(0, 5, 0);
return true;
}
catch (CommunicationObjectFaultedException faultEx)
{
// System.Diagnostics.Trace.TraceError(faultEx.ToString());
Console.WriteLine("An unknown exception was received. " + faultEx.Message + faultEx.StackTrace);
Console.Read();
return false;
}
catch (EndpointNotFoundException endEx)
{
// System.Diagnostics.Trace.TraceError(endEx.ToString());
Console.WriteLine("An unknown exception was received. " + endEx.Message + endEx.StackTrace);
Console.Read();
return false;
}
}
и я иногда получаю следующую ошибку, когда основной процесс занимает больше минуты.
Сообщение:
Эта операция запроса отправлена на
net.tcp: //127.0.0.1: 8000 / VSMDBCommunication
не получил ответ в течение
настроенное время ожидания (00:01:00).
Время, отведенное на эту операцию, может
был частью дольше
тайм-аут. Это может быть потому, что
сервис все еще обрабатывает
операция или потому что служба была
невозможно отправить ответное сообщение.
Пожалуйста, рассмотрите возможность увеличения
Тайм-аут операции (путем приведения
канал / прокси для IContextChannel и
установка свойства OperationTimeout)
и убедитесь, что служба способна
подключиться к клиенту.
Как я могу привести канал другим способом, чем я делаю, чтобы избежать этой ошибки, что имеет смысл, потому что базовый запрос может занять чуть более минуты для вычисления.