2011-07-21 27 views
14

Tôi đang cố gắng thêm phát hiện đặc biệt vào thiết lập dịch vụ khách hàng WCF đơn giản (hiện được triển khai bởi tự lưu trữ trong ứng dụng giao diện điều khiển). Gỡ lỗi bằng cách sử dụng VS2010 trên windows 7, và làm bất cứ điều gì tôi có thể tìm thấy trong hướng dẫn trực tuyến, nhưng vẫn còn - khách hàng khám phá chỉ đơn giản là không tìm thấy gì. Không cần phải nói nếu tôi mở một máy khách đến điểm cuối dịch vụ chính xác, tôi có thể truy cập dịch vụ từ máy khách.WCF Discovery đơn giản là không hoạt động

mã dịch vụ:

using (var selfHost = new ServiceHost(typeof(Renderer))) 
{ 
    try 
    { 
     selfHost.Open(); 
     ... 
     selfHost.Close(); 

dịch vụ app.config: Mã khám phá

<?xml version="1.0"?> 
<configuration> 
    <system.serviceModel> 
    <services> 
     <service name="TestApp.Renderer"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:9000" /> 
      </baseAddresses> 
     </host> 
     <endpoint address="ws" binding="wsHttpBinding" contract="TestApp.IRenderer"/> 
     <endpoint kind="udpDiscoveryEndpoint"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceDiscovery/> 
      <serviceMetadata httpGetEnabled="True"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

khách hàng:

DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint()); 
var criteria = new FindCriteria(typeof(IRenderer)) { Duration = TimeSpan.FromSeconds(5) }; 
var endpoints = discoveryClient.Find(criteria).Endpoints; 

Bộ sưu tập 'điểm cuối' luôn đi ra trống rỗng. Tôi đã thử chạy dịch vụ và ứng dụng khách từ trình gỡ rối, từ một dòng lệnh, từ dòng lệnh quản trị - mọi thứ, nhưng không có kết quả (tất cả trên máy cục bộ, tất nhiên, không phải là phần mềm tôi sẽ cần nó chạy toàn bộ subnet của tôi cuối cùng)

Bất kỳ trợ giúp sẽ được đánh giá cao :-)

+0

Tôi cũng đã thử thêm điểm cuối thông báo trong dịch vụDiscovery hành vi - điều đó cũng không giúp được – kbo

+0

có bất kỳ thông tin app.config nào cho khách hàng không? –

+0

cũng có bạn đã thử thêm một phạm vi? –

Trả lời

3

Chết tiệt! đó là tường lửa ... vì một số lý do tất cả các giao tiếp UDP đã bị chặn - vô hiệu hóa tường lửa đã khắc phục được sự cố. Bây giờ tôi chỉ cần tìm ra cấu hình tường lửa chính xác ...

+0

bạn đã bao giờ tìm ra cách cấu hình tường lửa chưa? Tôi đang gặp vấn đề tương tự. – odyth

+1

Có Khám phá dựa vào vụ nổ UDP để xác định vị trí dịch vụ –

35

Dưới đây là một ví dụ phát hiện siêu đơn giản. Nó không sử dụng một tập tin cấu hình, nó là tất cả các mã C#, nhưng bạn có thể có thể chuyển các khái niệm vào một tập tin cấu hình.

phần giao diện này giữa máy chủ và phần mềm client (sao chép vào từng chương trình cho bây giờ)

[ServiceContract] 
public interface IWcfPingTest 
{ 
    [OperationContract] 
    string Ping(); 
} 

đặt mã này trong chương trình chủ

public class WcfPingTest : IWcfPingTest 
{ 
    public const string magicString = "djeut73bch58sb4"; // this is random, just to see if you get the right result 
    public string Ping() {return magicString;} 
} 
public void WcfTestHost_Open() 
{ 
    string hostname = System.Environment.MachineName; 
    var baseAddress = new UriBuilder("http", hostname, 7400, "WcfPing"); 
    var h = new ServiceHost(typeof(WcfPingTest), baseAddress.Uri); 

    // enable processing of discovery messages. use UdpDiscoveryEndpoint to enable listening. use EndpointDiscoveryBehavior for fine control. 
    h.Description.Behaviors.Add(new ServiceDiscoveryBehavior()); 
    h.AddServiceEndpoint(new UdpDiscoveryEndpoint()); 

    // enable wsdl, so you can use the service from WcfStorm, or other tools. 
    var smb = new ServiceMetadataBehavior(); 
    smb.HttpGetEnabled = true; 
    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; 
    h.Description.Behaviors.Add(smb); 

    // create endpoint 
    var binding = new BasicHttpBinding(BasicHttpSecurityMode.None); 
    h.AddServiceEndpoint(typeof(IWcfPingTest) , binding, ""); 
    h.Open(); 
    Console.WriteLine("host open"); 
} 

đặt mã này trong chương trình khách hàng

private IWcfPingTest channel; 
public Uri WcfTestClient_DiscoverChannel() 
{ 
    var dc = new DiscoveryClient(new UdpDiscoveryEndpoint()); 
    FindCriteria fc = new FindCriteria(typeof(IWcfPingTest)); 
    fc.Duration = TimeSpan.FromSeconds(5); 
    FindResponse fr = dc.Find(fc); 
    foreach(EndpointDiscoveryMetadata edm in fr.Endpoints) 
    { 
    Console.WriteLine("uri found = " + edm.Address.Uri.ToString()); 
    } 
    // here is the really nasty part 
    // i am just returning the first channel, but it may not work. 
    // you have to do some logic to decide which uri to use from the discovered uris 
    // for example, you may discover "127.0.0.1", but that one is obviously useless. 
    // also, catch exceptions when no endpoints are found and try again. 
    return fr.Endpoints[0].Address.Uri; 
} 
public void WcfTestClient_SetupChannel() 
{ 
    var binding = new BasicHttpBinding(BasicHttpSecurityMode.None); 
    var factory = new ChannelFactory<IWcfPingTest>(binding); 
    var uri = WcfTestClient_DiscoverChannel(); 
    Console.WriteLine("creating channel to " + uri.ToString()); 
    EndpointAddress ea = new EndpointAddress(uri); 
    channel = factory.CreateChannel(ea); 
    Console.WriteLine("channel created"); 
    //Console.WriteLine("pinging host"); 
    //string result = channel.Ping(); 
    //Console.WriteLine("ping result = " + result); 
} 
public void WcfTestClient_Ping() 
{ 
    Console.WriteLine("pinging host"); 
    string result = channel.Ping(); 
    Console.WriteLine("ping result = " + result); 
} 

trên máy chủ, chỉ cần gọi hàm WcfTestHost_Open(), sau đó ngủ mãi mãi hay gì đó.

trên máy khách, chạy các chức năng này. Phải mất một thời gian ngắn để một máy chủ mở, do đó, có một số sự chậm trễ ở đây.

System.Threading.Thread.Sleep(8000); 
this.server.WcfTestClient_SetupChannel(); 
System.Threading.Thread.Sleep(2000); 
this.server.WcfTestClient_Ping(); 

chủ đầu ra sẽ giống như

host open 

đầu ra khách hàng sẽ trông như thế

uri found = http://wilkesvmdev:7400/WcfPing 
creating channel to http://wilkesvmdev:7400/WcfPing 
channel created 
pinging host 
ping result = djeut73bch58sb4 

này là nghiêm trọng đến mức tối thiểu tôi có thể đưa ra một ví dụ khám phá. Công cụ này khá nhanh phức tạp.

+4

Bài đăng tuyệt vời. Tôi yêu tất cả các mã ví dụ tối thiểu cho WCF! – Peladao

1

Vì đây là câu trả lời stackoverflow.com đầu tiên xuất hiện khi tôi tìm kiếm 'WCF Discovery', tôi sẽ đề xuất ví dụ mẫu thiết kế Juval Lowy: Ad-hoc Discovery. Đây là một ví dụ tuyệt vời về WCF Discovery sử dụng cả UdpDiscoveryEndpoint và MEX. Nếu bạn không quen thuộc với IDesign hoặc Juval Lowy, tôi cũng sẽ đề xuất điều này MSDN link.

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