2011-01-18 26 views
10

Việc thiết kế lớn như sau:WCF Discovery trả về URL mã hóa cứng

  1. Có ứng dụng nhất định mà được cài đặt như một dịch vụ Windows
  2. Có thể có một số các trên mạng
  3. Mỗi trong số đó cho thấy một số giao diện cho mạng (nghĩ về nó như "điều khiển từ xa" hoặc "cấu hình" - loại điều đó)
  4. Sau đó, có một ứng dụng khác hoạt động như một ứng dụng khách cho giao diện đó. bộ điều khiển "hoặc" công cụ cấu hình ")
  5. Mục tiêu của thứ hai là để đánh dấu tất cả các trường hợp cũ trên mạng, hiển thị chúng dưới dạng danh sách cho người dùng và cho phép người dùng poke chúng ở những nơi khác nhau bằng cách sử dụng giao diện tiếp xúc đó (tức là "điều khiển từ xa" hoặc "cấu hình" chúng)
  6. Vì mục đích đơn giản, hãy giả sử rằng mọi người ở trong cùng một mạng - nghĩa là mọi người có thể nghe các chương trình phát sóng UDP của nhau.

Khá đơn giản, eh? Tôi đã từng xây dựng những thứ này vào hàng chục ngày trước, sử dụng cơ chế khám phá dựa trên phát tán UDP của riêng tôi.

Nhưng bây giờ tôi nghĩ rằng tôi muốn được mát mẻ và hông, và đi với groovy WCF Discovery trong chế độ Ad Hoc. Và nó hoạt động! Ai có thể nói? :-)

Nhưng không hoàn toàn. Như đã lưu ý trước tôi herethere, khám phá sẽ trả lại URL được mã hóa cứng từ cấu hình của dịch vụ. Nghĩa là, nếu dịch vụ có <baseAddresses><add baseAddress="net.tcp://localhost:1234/My/Service" /></baseAddresses> trong tệp cấu hình của nó, thì đó chính xác là những gì tôi sẽ nhận được từ khách hàng khám phá - bao gồm cả phần "localhost".

Không cần phải nói, nếu tôi cố gắng gọi dịch vụ bằng URL đó, kết quả không phải là ly kỳ.

Vì vậy, câu hỏi đặt ra là: làm cách nào để làm cho trình khách khám phá cung cấp cho tôi URL có thể sử dụng thay vì đó là rác cục bộ-rác?

Để tiết kiệm thời gian của mọi người, một vài suy nghĩ rằng không làm việc:

  1. Thay đổi tập tin cấu hình của dịch vụ tại thời gian triển khai, mã hóa nó là địa chỉ IP thật hay tên máy.
    Không hoạt động, vì cả IP và tên máy đều có thể thay đổi.
  2. Định cấu hình dịch vụ từ mã (ít nhất một phần), sử dụng IP hoặc tên máy hiện tại để tạo URL.
    Không hoạt động. Tên máy là vô ích, bởi vì có thể không có một dns trong mạng. IP là vô ích, bởi vì máy tính có thể trên nhiều mạng cùng một lúc, và do đó, có một số địa chỉ IP (điều này không phải là giả thuyết, chúng tôi thực sự do có tình huống này). Mà một trong những sử dụng sau đó?

Nói cách khác, tôi không cần phải tinh chỉnh dịch vụ, mà là để làm cho khách hàng khám phá cung cấp cho tôi địa chỉ mà phản hồi khám phá đến từ đó.

Trả lời

13

Bạn sẽ có thể khắc phục điều này bằng cách thay thế localhost với một ký tự đại diện:

<baseAddresses><add baseAddress="net.tcp://*:1234/My/Service" /></baseAddresses> 
+0

Hey, nó hoạt động! Tôi nhớ đã cố gắng sử dụng các ký tự đại diện, nhưng có lẽ tôi đã làm nó trong một số thời trang không chính xác ... Cảm ơn! –

+0

Ồ. Nó nói rằng tôi chỉ có thể thưởng cho tiền thưởng không sớm hơn trong 15 giờ. Xin hãy nhắc tôi nếu tôi quên. –

+0

Lưu ý: Tôi nghĩ bạn sẽ liên kết với nhiều địa chỉ IP nếu bạn sử dụng ký tự đại diện (giả sử bạn có nhiều NIC) – Schneider

3

Không sử dụng cấu hình.

Chạy dịch vụ theo chương trình.

Dưới đây là một ví dụ của việc thêm các điểm cuối programtically: Programmatic_Endpoint_Configuration

Và đây, để so sánh: Self-hosting_and_base_addresses

+1

Điều này không giải quyết được sự cố. Xem đoạn thứ hai đến đoạn cuối cùng trong câu hỏi của tôi. –

0

Một tùy chọn khác với ký tự đại diện là sử dụng instad máy chủ có thể phân giải DNS của máy tính của localhost.

+1

Điều đó chỉ hoạt động nếu có DNS trong mạng. –

+0

Mạng nào không có DNS? – andrewbadera

+1

Có rất nhiều mạng không có DNS. Tôi làm việc với các mạng như vậy mọi lúc. –

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