Я ищу минимальный пример Именованных труб WCF (я ожидаю, что два минимальных приложения, сервер и клиент, которые могут связываться через именованный канал.)
В Microsoft есть статья Начало работы > , описывающая WCF через HTTP, и я ищу что-то похожее о WCF и именованных каналах.
Я нашел несколько сообщений в Интернете, но они немного "продвинуты". Мне нужно что-то минимальное, только обязательная функциональность, поэтому я могу добавить свой код и заставить приложение работать.
Как заменить это на использование именованного канала?
<endpoint address="http://localhost:8000/ServiceModelSamples/Service/CalculatorService"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ICalculator"
contract="ICalculator" name="WSHttpBinding_ICalculator">
<identity>
<userPrincipalName value="OlegPc\Oleg" />
</identity>
</endpoint>
Как заменить это на использование именованного канала?
// Step 1 of the address configuration procedure: Create a URI to serve as the base address.
Uri baseAddress = new Uri("http://localhost:8000/ServiceModelSamples/Service");
// Step 2 of the hosting procedure: Create ServiceHost
ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
try
{
// Step 3 of the hosting procedure: Add a service endpoint.
selfHost.AddServiceEndpoint(
typeof(ICalculator),
new WSHttpBinding(),
"CalculatorService");
// Step 4 of the hosting procedure: Enable metadata exchange.
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
selfHost.Description.Behaviors.Add(smb);
// Step 5 of the hosting procedure: Start (and then stop) the service.
selfHost.Open();
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHostBase to shutdown the service.
selfHost.Close();
}
catch (CommunicationException ce)
{
Console.WriteLine("An exception occurred: {0}", ce.Message);
selfHost.Abort();
}
Как создать клиент для использования именованного канала?
Ответ 1
Я только что нашел этот отличный небольшой учебник. Неверная ссылка (Кэшированная версия)
Я также последовал за учебником Microsoft, который хорош, но мне нужны только трубы.
Как вы можете видеть, вам не нужны файлы конфигурации и все эти беспорядочные вещи.
Кстати, он использует как HTTP, так и каналы. Просто удалите все строки кода, связанные с HTTP, и вы получите пример чистой трубы.
Ответ 2
Попробуйте это.
Вот сервисная часть.
[ServiceContract]
public interface IService
{
[OperationContract]
void HelloWorld();
}
public class Service : IService
{
public void HelloWorld()
{
//Hello World
}
}
Вот прокси
public class ServiceProxy : ClientBase<IService>
{
public ServiceProxy()
: base(new ServiceEndpoint(ContractDescription.GetContract(typeof(IService)),
new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/MyAppNameThatNobodyElseWillUse/helloservice")))
{
}
public void InvokeHelloWorld()
{
Channel.HelloWorld();
}
}
И вот часть хостинга службы.
var serviceHost = new ServiceHost
(typeof(Service), new Uri[] { new Uri("net.pipe://localhost/MyAppNameThatNobodyElseWillUse") });
serviceHost.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "helloservice");
serviceHost.Open();
Console.WriteLine("Service started. Available in following endpoints");
foreach (var serviceEndpoint in serviceHost.Description.Endpoints)
{
Console.WriteLine(serviceEndpoint.ListenUri.AbsoluteUri);
}
Ответ 3
Ознакомьтесь с моим очень упрощенным примером Echo:
Он предназначен для использования базовой HTTP-связи, но его можно легко изменить, чтобы использовать именованные каналы, отредактировав файлы app.config для клиента и сервера. Внесите следующие изменения:
Отредактируйте файл app.config, удалив или закомментировав запись http baseAddress и добавив новую baseAddress для именованного канала (называемый net.pipe). Кроме того, если вы не собираетесь использовать HTTP для протокола связи, убедитесь, что serviceMetadatastrong > и serviceDebug либо закомментированы, либо удалены:
<configuration>
<system.serviceModel>
<services>
<service name="com.aschneider.examples.wcf.services.EchoService">
<host>
<baseAddresses>
<add baseAddress="net.pipe://localhost/EchoService"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors></serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Отредактируйте файл app.config, чтобы basicHttpBinding либо закомментирован, либо удален, а netNamedPipeBinding. Вам также потребуется изменить запись конечная точка для использования канала:
<configuration>
<system.serviceModel>
<bindings>
<netNamedPipeBinding>
<binding name="NetNamedPipeBinding_IEchoService"/>
</netNamedPipeBinding>
</bindings>
<client>
<endpoint address = "net.pipe://localhost/EchoService"
binding = "netNamedPipeBinding"
bindingConfiguration = "NetNamedPipeBinding_IEchoService"
contract = "EchoServiceReference.IEchoService"
name = "NetNamedPipeBinding_IEchoService"/>
</client>
</system.serviceModel>
</configuration>
Приведенный выше пример будет работать только с именованными каналами, но ничто не мешает вам использовать несколько протоколов для запуска вашей службы. AFAIK, вы должны иметь возможность запускать службу на сервере с использованием как именованных каналов, так и HTTP (а также других протоколов).
Кроме того, привязка в файле app.config клиента очень упрощена. Существует множество различных параметров, которые вы можете настроить, помимо указания baseAddress...
Ответ 4
Я создал этот простой пример из разных результатов поиска в Интернете.
public static ServiceHost CreateServiceHost(Type serviceInterface, Type implementation)
{
//Create base address
string baseAddress = "net.pipe://localhost/MyService";
ServiceHost serviceHost = new ServiceHost(implementation, new Uri(baseAddress));
//Net named pipe
NetNamedPipeBinding binding = new NetNamedPipeBinding { MaxReceivedMessageSize = 2147483647 };
serviceHost.AddServiceEndpoint(serviceInterface, binding, baseAddress);
//MEX - Meta data exchange
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
serviceHost.Description.Behaviors.Add(behavior);
serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexNamedPipeBinding(), baseAddress + "/mex/");
return serviceHost;
}
Используя вышеуказанный URI, я могу добавить ссылку в моем клиенте к веб-службе.