2011-09-08 39 views
86

Tôi đang tìm ví dụ tối thiểu của WCF Named Pipes (Tôi hy vọng hai ứng dụng tối thiểu, máy chủ và máy khách, có thể giao tiếp thông qua một đường ống đặt tên.)WCF tên ống tối thiểu dụ

Microsoft có bài viết rực rỡ Getting Started Tutorial mô tả WCF qua HTTP, và tôi đang tìm kiếm một cái gì đó tương tự về WCF và tên ống.

Tôi đã tìm thấy một số bài đăng trên Internet, nhưng chúng hơi "nâng cao" một chút. Tôi cần một cái gì đó tối thiểu, chỉ có chức năng bắt buộc, vì vậy tôi có thể thêm mã của tôi và làm cho ứng dụng hoạt động.

Làm cách nào để thay thế điều đó để sử dụng một đường ống có tên?

<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> 

Làm cách nào để thay thế để sử dụng một đường ống có tên?

// 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(); 
} 

Làm cách nào để tạo khách hàng sử dụng một đường ống có tên?

+1

bạn đã xem http://stackoverflow.com/questions/184878/expose-a-wcf-service-through-a-named-pipes-binding chưa? –

+1

vẫn không nhận được ... – javapowered

Trả lời

78

Tôi vừa tìm thấy this excellent little tutorial.liên kết bị hỏng (Cached version)

Tôi cũng đã làm theo hướng dẫn của Microsoft rất hay, nhưng tôi cũng chỉ cần đường ống.

Như bạn có thể thấy, bạn không cần tệp cấu hình và tất cả những thứ lộn xộn đó.

Nhân tiện, anh ấy sử dụng cả HTTP và đường ống. Chỉ cần loại bỏ tất cả các dòng mã liên quan đến HTTP, và bạn sẽ nhận được một ví dụ đường ống thuần túy.

+2

Cảm ơn! Ngoài ra, khi cố gắng xây dựng một dịch vụ sử dụng web.config cho cấu hình của nó thay vì cấu hình hardcoded, hãy xem ví dụ microsoft này: http://msdn.microsoft.com/en-us/library/ms752253.aspx – Nullius

+3

Liên kết doesn 't làm việc, là hướng dẫn bất cứ nơi nào khác? – user1069816

+0

Liên kết đó chính xác là những gì tôi cần, cảm ơn bạn. – Patrick

52

Hãy thử điều này.

Đây là phần dịch vụ.

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    void HelloWorld(); 
} 

public class Service : IService 
{ 
    public void HelloWorld() 
    { 
     //Hello World 
    } 
} 

Đây là Proxy

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

Và đây là phần dịch vụ lưu trữ.

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); 
    } 
+0

cảm ơn, tôi sẽ xem xét ... – javapowered

+0

Điều này có thể hiệu quả nhưng không linh hoạt như chỉnh sửa ứng dụng Các tệp .config cho máy khách và máy chủ ... –

+7

Rất tốt, vì việc tiết lộ chi tiết ứng dụng thông qua các tệp app.config thường không được mong muốn. –

11

Check-out của tôi highly simplified Echo example: Nó được thiết kế để sử dụng giao tiếp HTTP cơ bản, nhưng nó có thể dễ dàng được sửa đổi để sử dụng ống đặt tên bằng cách chỉnh sửa app.config file cho client và server. Tận dụng những thay đổi sau đây:

Chỉnh sửa tập tin app.config của máy chủ, loại bỏ hoặc cho ý kiến ​​ra http baseAddress nhập và thêm một mới baseAddress nhập cảnh cho các đường ống đặt tên (gọi tắt là net.pipe).Ngoài ra, nếu bạn không có ý định về việc sử dụng HTTP cho một giao thức truyền thông, đảm bảo serviceMetadataserviceDebug hoặc là nhận xét ra hoặc xóa:

<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> 

Chỉnh sửa hồ sơ của khách hàng app.config nên rằng basicHttpBinding được nhận xét hoặc bị xóa và một mục nhập netNamedPipeBinding được thêm vào. Bạn cũng sẽ cần phải thay đổi mục endpoint sử dụng ống:

<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> 

Ví dụ trên sẽ chỉ chạy với đường ống được đặt tên, nhưng không được ngăn cản bạn từ việc sử dụng nhiều giao thức để chạy dịch vụ của bạn. AFAIK, bạn sẽ có thể có một máy chủ chạy một dịch vụ bằng cách sử dụng cả hai tên ống và HTTP (cũng như các giao thức khác).

Ngoài ra, ràng buộc trong ứng dụng app.config tệp được đơn giản hóa cao nhất. Có rất nhiều thông số khác nhau mà bạn có thể điều chỉnh, ngoài việc chỉ xác định baseAddress ...

+3

Các liên kết hiện đã chết. –

0

Tôi tạo ra ví dụ này đơn giản từ kết quả tìm kiếm khác nhau trên internet.

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

Sử dụng URI ở trên Tôi có thể thêm tham chiếu trong ứng dụng khách vào dịch vụ web.

Các vấn đề liên quan