У меня есть клиентское приложение WinForms. У меня сервер WCF работает на другом компьютере как часть службы Windows, которую я написал. Сначала я попробовал NetPipeBinding
, а теперь NetTcpBinding
. Я открыл 2 порта в Windows Firewall с расширенной безопасностью . Операционная система сервера: Windows Сервер 2016 .
. Вот код сервера:
public Boolean CreatePipeServer(out string logEntry)
{
try
{
NetTcpBinding ipcBinding = new NetTcpBinding()
{
Security = new NetTcpSecurity()
{
Mode = SecurityMode.None,
Transport = new TcpTransportSecurity()
{
ClientCredentialType = TcpClientCredentialType.None,
ProtectionLevel = System.Net.Security.ProtectionLevel.None,
},
},
MaxBufferPoolSize = 6553600,
MaxBufferSize = 6553600,
MaxReceivedMessageSize = 6553600,
MaxConnections = 1000,
ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas()
{
MaxArrayLength = 2147483647,
MaxBytesPerRead = 2147483647,
MaxDepth = 2147483647,
MaxNameTableCharCount = 2147483647,
MaxStringContentLength = 2147483647,
},
};
// Instantiate: Host Service
Uri uriMex = new Uri("http://localhost:8000");
this.ServiceParent.ServiceIpcAppToService.HostIpcAppToService = new ServiceHost(typeof(IpcAppToService), uriMex);
// Instantiate: Endpoint
Uri uriService = new Uri("net.tcp://localhost:8004/StampIpcAppToService");
this.ServiceParent.ServiceIpcAppToService.HostIpcAppToService.AddServiceEndpoint(typeof(StampIpc.IIpcAppToService), ipcBinding, uriService);
// Instantiate: Service Meta Behavior
ServiceMetadataBehavior ipcSmb = this.ServiceParent.ServiceIpcAppToService.HostIpcAppToService.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (null == ipcSmb)
{
ipcSmb = new ServiceMetadataBehavior()
{
HttpGetEnabled = true,
};
this.ServiceParent.ServiceIpcAppToService.HostIpcAppToService.Description.Behaviors.Add(ipcSmb);
ServiceDescription serviceDescription = this.ServiceParent.ServiceIpcAppToService.HostIpcAppToService.Description;
}
// Instantiate: MEX Biding
Binding ipcMexBinding = MetadataExchangeBindings.CreateMexHttpBinding();
this.ServiceParent.ServiceIpcAppToService.HostIpcAppToService.AddServiceEndpoint(typeof(IMetadataExchange), ipcMexBinding, "MEX");
// Capture events.
...
// Start the service.
this.ServiceParent.ServiceIpcAppToService.HostIpcAppToService.Open();
return true;
}
catch (Exception) { }
return false;
}
Я пытаюсь проверить действующий канал связи, перейдя к Add > Service Reference...
в Visual Studio 2019
. Независимо от того, что я печатаю, я получаю ошибки того или иного рода. В настоящее время я разместил:
net.tcp://10.10.70.134:8004/StampIpcAppToService
Это выдает ошибку:
Префикс URI не распознан. Метаданные содержат ссылку, которая не может быть разрешена: 'net .tcp: //10.10.70.134: 8004 / StampIpcAppToService'. Метаданные содержат ссылку, которая не может быть разрешена: 'net .tcp: //10.10.70.134: 8004 / StampIpcAppToService'. Если служба определена в текущем решении, попробуйте создать решение и снова добавить ссылку на службу.
У меня уже есть код клиента, но если я не могу заставить работать Add Service Reference
, тогда код клиента определенно не будет работать.
Приведенный выше код начинается как часть события OnStart
для Windows Service
.
Что я делаю не так?
ОБНОВЛЕНИЕ
Ответ разрешил прямой вопрос выше, однако мой реальный код использует код, похожий на серверный, и я получаю ошибку. Я изменил код, основываясь на ответе и немного отладки. Текущий код:
Исключение:
InnerException = {"Сообщение с действием '
http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence' не может быть обработано в получателе, из-за несоответствия ContractFilter в EndpointDispatcher. Это может быть связано либо с несоответствием контракта (несоответствующие действия между ...
ОБНОВЛЕНИЕ 2 (отражает обновленный ответ)
Использование NetTcpBinding
создает эту ошибку:
Использование URI:
Uri ipcUri = new Uri($"net.tcp://10.10.70.134:8004");
Создание
Message = "There was no endpoint listening at net.tcp://jmr-engineering:8004/ that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details."
Использование URI:
Uri ipcUri = new Uri($"net.tcp://10.10.70.134:8000");
Генерирует
Message = "You have tried to create a channel to a service that does not support .Net Framing. It is possible that you are encountering an HTTP endpoint."
InnerException = {"Expected record type 'PreambleAck', found '72'."}
ОТВЕТ:
Принятый ответ нуждается в модификации. У Авраама не было правильного URI
, однако он указал мне на SvcUtil.exe
, который дал мне это.
URI:
net.tcp://10.10.70.134:8004/StampIpcAppToService
Мне нужно NetTcpBinding
, поэтому окончательный код на стороне клиента:
Здесь вывод output.config
из SvcUtil.exe
. Файл IpcAppToService.cs
был бесполезен, но файл конфигурации определенно был полезен.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IIpcAppToService">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://localhost:8004/StampIpcAppToService"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IIpcAppToService"
contract="IIpcAppToService" name="NetTcpBinding_IIpcAppToService" />
</client>
</system.serviceModel>
</configuration>