2010-12-26 28 views
11

WCF newbie ở đây ... Tôi đang cố gắng tự lưu trữ một dịch vụ WCF bằng cách sử dụng NetTcpBinding. Dựa trên MSDN "how-to" tutorial Tôi đã làm tất cả những ràng buộc trong mã, mà tôi sau đó thay đổi từ wsHttpBinding để NetTcpBinding, và bây giờ trông như thế này:Bạn có thể thực hiện NetTcpBinding trong mã không? Có nên không?

var baseAddress = new Uri("net.tcp://localhost:8000/MyWebService"); 
var selfHost = new ServiceHost(typeof(ConcreteWebService), baseAddress); 
try { 
    var binding = new NetTcpBinding(); 
    binding.Security.Mode = SecurityMode.Message; 
    selfHost.AddServiceEndpoint(typeof(IWebService), binding, "TRWebService"); 
    selfHost.Open(); 
    Console.WriteLine("The service is ready at {0}", baseAddress.AbsoluteUri); 
    Console.WriteLine("Press <ENTER> to terminate service."); 
    Console.WriteLine(); 
    Console.ReadLine(); 

    selfHost.Close(); 
} catch (CommunicationException ce) { 
    Console.WriteLine("An exception occurred: {0}", ce.Message); 
    selfHost.Abort(); 
} 

Thing là, các hướng dẫn sau đó nói rằng bạn phải chạy svcutil.exe để tạo proxy cho khách hàng ... nhưng kể từ khi tôi chuyển sang NetTcpBinding, svcutil không hoạt động nữa - không thể phát hiện dịch vụ của tôi. Tôi googled vấn đề, và thấy rằng mỗi ví dụ duy nhất ra khỏi NetTcpBinding hiện các thiết lập trong file app.config, không phải trong mã, và tất cả họ thêm một điểm cuối gọi là "Mex", với loại ràng buộc của "mexTcpBinding". Dường như không có mã nào tương đương với mã này.

Vì vậy, tôi có phải thay đổi dự án của mình để sử dụng app.config và từ bỏ phương pháp dựa trên mã không? Bất cứ ai có thể giải thích cho tôi những gì Mex là, tại sao tôi cần nó, và tại sao nó (rõ ràng) không thể được gọi trong mã - hoặc nếu nó có thể, làm thế nào, hoặc tại sao nó nản lòng? Nói chung, khi nào thì tốt hơn khi sử dụng app.config và khi mã cho các dịch vụ WCF?

+0

Tôi đã làm theo chính xác cùng hướng dẫn và các hợp đồng gọi lại mong muốn vì vậy sau khi tôi chuyển sang tcp, tôi đã có cùng một vấn đề chính xác. – bryanbcook

Trả lời

17

Nếu bạn sử dụng netTcpBinding - và trong môi trường mạng LAN "phía sau doanh nghiệp", chắc chắn là một ý tưởng tuyệt vời để làm như vậy - bạn cũng cần để lộ điểm cuối MEX (Metadata Exchange) bằng cách sử dụng mexTcpBinding theo thứ tự cho svcutil để có thể phát hiện và tìm thấy dịch vụ đó.

MEX = Trao đổi siêu dữ liệu là cơ chế mà WCF sử dụng để "quảng cáo công khai" dịch vụ trông như thế nào. Nếu bạn có điểm cuối MEX, thì các tiện ích như svcutil có thể truy vấn và "khám phá" một dịch vụ, ví dụ: tìm hiểu về tất cả các phương thức dịch vụ mà nó đưa ra, về các tham số mà nó mong đợi nhận được và cứ như vậy.

Để thêm điểm cuối MEX, bạn chắc chắn có thể sử dụng mã! Một cái gì đó giống như đoạn này:

var mexBinding = MetadataExchangeBindings.CreateMexTcpBinding(); 
selfHost.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, "mex"); 

Without MEX, bạn cần phải bằng cách nào đó "nói" cho khách hàng cố gắng để tiêu thụ dịch vụ của bạn những gì nó là dịch vụ của bạn cung cấp để khách hàng có thể đảm bảo để gọi các phương pháp thích hợp với phù hợp thông số.

+0

+1 Cảm ơn bạn đã giải thích! Điều gì về thiết lập trong app.config vs trong mã? –

+0

@Shaul: app.config mang lại cho bạn sự linh hoạt hơn - bạn có thể thay đổi nó thành basicHttpBinding mà không cần thay đổi mã và biên dịch lại - nhưng khác hơn thế, thực hiện nó trong mã chỉ là tốt. Chọn bất cứ điều gì phù hợp với nhu cầu của bạn! –

+0

Cảm ơn .. câu trả lời tuyệt vời. – Prasanth

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