Минимальный пример именованного канала WCF



Я ищу минимальный пример именованных каналов WCF (я ожидаю два минимальных приложения, сервер и клиент, которые могут взаимодействовать через именованный канал.)



У Microsoft есть статья briliant Начало Работы это описывает WCF через HTTP, и я ищу что-то подобное о WCF и именованных каналах.



Я нашел несколько постов в интернете, но они немного "продвинутых". Мне нужно что-то минимальное, только обязательная функциональность, поэтому я могу добавить свой код и заставить приложение работать.



Как мне заменить это, чтобы использовать именованный канал?



<endpoint address="http://localhost:8000/ServiceModelSamples/Service/CalculatorService"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ICalculator"
contract="ICalculator" name="WSHttpBinding_ICalculator">
<identity>
<userPrincipalName value="OlegPcOleg" />
</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();
}


Как создать клиент для использования именованного канала?

541   4  

4 ответов:

Я только что нашел это отличный маленький учебник.битая ссылка (кэшированная версия)

Я также следовал учебнику Microsoft, который хорош, но мне нужны были только трубы.

Как видите, вам не нужны файлы конфигурации и все эти грязные вещи.

кстати, он использует как HTTP, так и pipes. Просто удалите все строки кода, связанные с HTTP, и вы получите чистый пример трубы.

попробуйте это.

вот служебная часть.

[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);
    }

проверьте мои сильно упрощенном примере Echo: Он предназначен для использования базовой связи HTTP, но его можно легко изменить для использования именованных каналов путем редактирования приложение.конфигурации файлы для клиента и сервера. Внесите следующие изменения:

редактировать сервер приложение.конфигурации файл, удаление или комментирование http baseAddress ввод и добавление нового baseAddress запись для именованного канала (называется net.труба). Кроме того, если вы не собираетесь использовать HTTP для протокола связи, убедитесь, что serviceMetadata и 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>

редактировать клиента приложение.конфигурации так что 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 (а также другие протоколы).

кроме того, обязательными у клиента приложение.конфигурации файл сильно упрощен. Есть много различных параметров, которые вы можете настроить, помимо простого указания baseAddress...

Я создал этот простой пример из результатов поиска в интернете.

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, я могу добавить ссылку в своем клиенте на веб-службу.

Comments

    Ничего не найдено.