WCF 명명 된 파이프 최소 예제


90

WCF Named Pipes의 최소한의 예를 찾고 있습니다 (이름이 지정된 파이프를 통해 통신 할 수있는 두 개의 최소 응용 프로그램, 서버 및 클라이언트가 필요합니다.)

Microsoft는 HTTP를 통해 WCF를 설명 하는 시작하기 자습서 를 제공하며 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();
}

명명 된 파이프를 사용하려면 클라이언트를 어떻게 생성합니까?


답변:


80

방금 이 훌륭한 작은 튜토리얼을 찾았습니다 . 끊어진 링크 ( 캐시 된 버전 )

나는 또한 좋은 마이크로 소프트의 튜토리얼을 따랐지만 파이프 만 필요했다.

보시다시피 구성 파일과 그 모든 지저분한 물건이 필요하지 않습니다.

그건 그렇고, 그는 HTTP와 파이프를 모두 사용합니다. HTTP와 관련된 모든 코드 라인을 제거하면 순수한 파이프 예제를 얻을 수 있습니다.


2
감사! 또한 하드 코딩 된 구성 대신 해당 구성에 web.config를 사용하는 서비스를 빌드하려는 경우 다음 Microsoft 예제를 참조하십시오. msdn.microsoft.com/en-us/library/ms752253.aspx
Nullius

3
링크가 작동하지 않습니다. 튜토리얼이 다른 곳에 있습니까?
user1069816

"파이프가 종료 된"이유를 알아 내려고 잠시 시간을 보냈습니다. 이 문제에 대한 내 해결 방법은 다음과 같습니다. stackoverflow.com/a/49075797/385273
Ben

62

이 시도.

다음은 서비스 부분입니다.

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

이 작동 할 수 있지만 그냥 ... 클라이언트와 서버의의 app.config 파일을 편집로는되지 유연
앨런 S

9
좋습니다. app.config 파일을 통해 애플리케이션 세부 정보를 노출하는 것은 종종 바람직하지 않기 때문입니다.
Frank Hileman 2014 년

14
이것은 훌륭한 예이지만 net.pipe : // localhost /의 기본 주소를 사용하지 마십시오. 시스템에 net.pipe : // localhost /를 사용하는 다른 프로그램이있는 경우 ServiceHost를 열 때 예외가 발생합니다. 대신 net.pipe : // localhost / MyAppNameThatNobodyElseWillUse와 같은 고유 한 것을 사용하십시오. 이것이 다른 사람의 시간과 좌절을 덜어주기를 바랍니다!
Doug Clutter

이 솔루션은 잘 작동합니다. 특히 구성에 서비스 참조가 필요하지 않은 내부 엔드 포인트의 경우. 계약 (단순히 인터페이스 정의)을 자체 어셈블리에 유지하고 구성의 주소를 유지하십시오. 바인딩이 변경 될 가능성은 낮습니다.
Rob Von Nesselrode

2
/helloservice프록시의 끝점 주소 끝에 추가 해야했습니다.
Mormegil

14

매우 단순화 된 Echo 예제를 확인하십시오 . 기본 HTTP 통신을 사용하도록 설계되었지만 클라이언트 및 서버에 대한 app.config 파일을 편집하여 명명 된 파이프를 사용하도록 쉽게 수정할 수 있습니다 . 다음과 같이 변경하십시오.

서버의 app.config 파일을 편집하여 http baseAddress 항목을 제거하거나 주석 처리 하고 명명 된 파이프 ( net.pipe 라고 함 )에 대한 새 baseAddress 항목을 추가합니다 . 또한 통신 프로토콜에 HTTP를 사용하지 않으려는 경우 serviceMetadataserviceDebug 가 주석 처리되거나 삭제 되었는지 확인하십시오 .

<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를 지정하는 것 외에도 조정할 수있는 다양한 매개 변수가 있습니다 .


5
이제 링크가 끊어졌습니다.
크리스 웨버

2

인터넷의 다양한 검색 결과에서이 간단한 예를 만들었습니다.

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를 사용하여 클라이언트에서 웹 서비스에 대한 참조를 추가 할 수 있습니다.


-2

이 사이트가 정말 도움이되었고 예제 프로젝트는 조정없이 실행됩니다. https://dotnet-experience.blogspot.com/2012/02/inter-process-duplex-communication-with.html

Windows 기능에서 Named Pipe 지원을 활성화하는 것을 잊지 마십시오. 이 기사에는 상위 답변에서 그 효과에 대한 좋은 스크린 샷이 있습니다. App.Config를 사용하는 Windows 서비스의 WCF 명명 된 파이프에서

허용 된 솔루션에서 참조 된 프로젝트가 내 PC에서있는 그대로 실행되지 않습니다. app.config에서 몇 가지 수정을 시도했지만 여전히 다음 예외가 발생합니다.

System.InvalidOperationException : '서비스'WpfWcfNamedPipeBinding.NamedPipeBindingService '에 응용 프로그램 (비 인프라) 끝 점이 없습니다. 이는 애플리케이션에 대한 구성 파일이 없거나 구성 파일에서 서비스 이름과 일치하는 서비스 요소를 찾을 수 없거나 서비스 요소에 정의 된 엔드 포인트가 없기 때문일 수 있습니다. '

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.