2009-12-04 10 views
7

Tôi là nhà phát triển dịch vụ WCF. Khách hàng thử nghiệm của tôi làm việc rất tốt với nó. Nhưng khi nói đến khách hàng thực sự (sử dụng cùng một proxy máy khách), nó không thành công. Các dịch vụ WCF cùng làm việc với netTcpBinding, lỗi này chỉ xảy ra với netNamedPipeBinding, ngay cả với ConcurrencyMode = ConcurrencyMode.SingleKhông được tìm thấy đường ống có tên khi sử dụng WCF netNamedPipeBinding

Dưới đây là ngoại lệ

Không có endpoint nghe tại net.pipe: // localhost/MyService có thể chấp nhận tin nhắn. Đây là thường do địa chỉ không chính xác hoặc hành động SOAP. Xem InnerException, nếu có hiện tại, để biết thêm chi tiết.

server stack trace: tại

System.ServiceModel.Channels.PipeConnectionInitiator.GetPipeName (Uri uri ) tại System.ServiceModel.Channels.NamedPipeConnectionPoolRegistry.NamedPipeConnectionPool.GetPoolKey (EndpointAddress địa chỉ, Uri qua) tại System.ServiceModel.Channels.CommunicationPool`2.TakeConnection (EndpointAddress address, Uri via, TimeSpan timeout, TKey & key) tại System.ServiceModel .Channels.ConnectionPoolHelper.EstablishConnection (TimeSpan timeout) tại System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen (TimeSpan timeout) tại System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan timeout) tại System.ServiceModel.Channels .ServiceChannel.OnOpen (TimeSpan timeout) tại System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan timeout) tại System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce (TimeSpan timeout, CallOnceManager cascade)
tại System.ServiceModel.Channels.ServiceChannel.EnsureOpene d (TimeSpan timeout) tại System.ServiceModel.Channels.ServiceChannel.Call (String hành động, Boolean oneway, ProxyOperationRuntime hoạt động, Object [] ins, Object [] outs, TimeSpan timeout) tại System.ServiceModel. Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage methodCall, ProxyOperationRuntime hoạt động) tại System.ServiceModel.Channels.ServiceChannelProxy.Invoke (IMessage nhắn)

Exception rethrown tại [0]: tại System.Runtime.Remoting.Proxies .RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg) tại System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & msgData, Int32 loại) tại

Exception Nội

PipeException: "Các thiết bị đầu cuối đường ống ' net.pipe: // localhost/MyService 'không thể tìm thấy trên máy cục bộ của bạn."

+1

Chỉ cần làm rõ - khách hàng của bạn và dịch vụ của bạn ở cùng một máy? Nếu không có tên ống sẽ không làm việc ... – Murph

+0

@Murph, có họ đang trên cùng một máy. –

+0

Bạn đã giải quyết được vấn đề này chưa? Tôi đang gặp vấn đề tương tự. – Tsury

Trả lời

18

Theo dõi ngăn xếp cho thấy ngăn xếp kênh WCF phía máy khách không thành công khi cố gắng lấy từ URL dịch vụ tên thực tế của tên được đặt tên đường ống đang được dịch vụ sử dụng. Dịch vụ xuất bản tên đường ống (là một GUID thay đổi mỗi khi dịch vụ khởi động lại) bằng cách đặt một cấu trúc nhỏ trong a named shared memory section có chứa GUID là một trong các trường của nó. Tên được sử dụng cho phần bộ nhớ chia sẻ có nguồn gốc từ URL dịch vụ bằng cách áp dụng một thuật toán được biên dịch vào cả mã WCF phía máy chủ và phía máy khách cho NetNamedPipeBinding.

Ngoại lệ được báo cáo trong câu hỏi thực sự có nghĩa là đã áp dụng thuật toán cho URL dịch vụ để đưa ra tên, mã phía máy khách không thể mở tay cầm vào phần bộ nhớ dùng chung của tên đó. Điều này có thể có nghĩa là, như thông điệp ngoại lệ nói, rằng không có dịch vụ nghe trên URL dịch vụ được sử dụng để lấy được tên. Nhưng nó có thể thay vào đó có nghĩa là phần bộ nhớ là có, và như vậy là dịch vụ, nhưng mã phía máy khách không chạy trong một bối cảnh bảo mật cho phép nó truy cập vào bộ nhớ chia sẻ.

Trên nền tảng Windows trước Vista, rất khó có một ứng dụng WCF thiếu quyền bảo mật để mở bộ nhớ dùng chung, đọc tên đường GUID từ nó và sau đó kết nối thành công với đường ống của dịch vụ. Nhưng trên Vista và các nền tảng mới hơn có những cơ chế bảo mật mới khiến cho đây trở thành một tình huống thất bại phổ biến hơn nhiều.

Vista giới thiệu khái niệm về các không gian tên khác nhau cho các đối tượng hạt nhân được đặt tên: có vùng tên chung (toàn bộ máy) và không gian tên riêng cho mỗi phiên đăng nhập. Mã máy khách NetNamedPipeBinding sẽ thử cả hai không gian tên khi tìm kiếm phần bộ nhớ dùng chung để quảng cáo tên đường ống. Nếu máy chủ đã tạo bộ nhớ chia sẻ bằng cách sử dụng tên Chung hoặc nếu dịch vụ và ứng dụng khách đang chạy trong cùng phiên đăng nhập, thì máy khách sẽ tìm thấy những gì nó đang tìm kiếm. Mặc dù vậy, nếu dịch vụ không thể tạo một đối tượng trong không gian tên chung (nó luôn cố gắng thực hiện điều này trước) thì nó sẽ quay trở lại để tạo ra không gian tên phiên riêng, và sau đó chỉ các máy khách đang chạy trong cùng một phiên mới có thể thấy nó. Việc tạo các đối tượng hạt nhân không gian tên toàn cầu đòi hỏi một đặc quyền đặc biệt trong các nền tảng Vista và sau này, thường chỉ các quy trình và các ứng dụng Windows Service đang chạy "As Administrator" mới có. Một lỗ hổng phổ biến là cố gắng tạo một máy khách trong một Dịch vụ Windows cố gắng kết nối với một dịch vụ WCF NetNamedPipe được lưu trữ trong một ứng dụng đang chạy trong phiên người dùng tương tác.

Cơ chế tính toàn vẹn bắt buộc của Vista cũng có thể ngăn chặn máy khách kết nối với dịch vụ WCF NetNamedPipeBinding, nếu mã khách hàng đang chạy trong ngữ cảnh toàn vẹn thấp hơn (ví dụ: trình duyệt plug-in) so với mã lưu trữ dịch vụ. Tôi có thể tưởng tượng rằng các triệu chứng được báo cáo trong câu hỏi, với khách hàng thử nghiệm làm việc nhưng khách hàng thực sự không hoạt động, gần như chắc chắn gây ra bởi bối cảnh an ninh của các khách hàng thực sự không phù hợp với máy chủ dịch vụ, cho một hay khác của những lý do này.

+0

Đây là câu trả lời chính xác cho vấn đề thực tế của tôi. Đối với hồ sơ, tôi chỉ cần bắt đầu Visual Studio với sự cho phép hành chính để làm cho nó hoạt động. Ngoài ra, khởi động cả máy khách và máy chủ từ một dấu nhắc lệnh là một giải pháp. Cảm ơn rất nhiều cho câu trả lời chi tiết! – BeardinaSuit

+1

Có, nhưng nếu tôi không muốn chạy với tư cách quản trị viên thì sao? Các quy trình của tôi ở cùng một phiên. – Tsury

3

Các thiết bị đầu cuối được sử dụng bởi khách hàng của bạn có để phù hợp với một thiết bị đầu cuối tiếp xúc bởi dịch vụ WCF của bạn. Điều này có nghĩa rằng địa chỉ/ràng buộc/hợp đồng tuple của thiết bị đầu cuối khách hàng quy định phải chính xác trận địa chỉ/ràng buộc/hợp đồng tuple của một điểm cuối tiếp xúc với dịch vụ WCF của bạn.Nếu bạn đang sử dụng cách tiếp cận app.config, hãy chắc chắn rằng tất cả mọi thứ được viết đúng trong cả hai dịch vụ WCF và tập tin cấu hình máy khách. Nếu bạn đang thêm các thiết bị đầu cuối lập trình, hãy chắc chắn rằng bạn haven '

+0

Cảm ơn bạn đã đăng bài này, nhưng đây không phải là trường hợp của tôi. –

+0

Thông tin đăng nhập có quan trọng trong trường hợp này không? Nếu một quy trình thuộc sở hữu của một người dùng có thể truy cập các đường ống được đặt tên do người dùng khác tạo ra? –

+0

Tôi không biết chắc chắn. Tôi sử dụng các đường ống được đặt tên để liên lạc từ máy khách đăng nhập cục bộ của tôi với dịch vụ Windows tài khoản hệ thống của tôi trên cùng một máy mà không có vấn đề gì. –

4

Một khả năng khác để khắc phục sự cố gốc này nếu tìm kiếm lỗi này và gặp phải bài đăng này - nếu bạn gặp phải lỗi, bạn có thể tìm thấy địa chỉ net.pipe tại url của mình (ví dụ:http://localhost:1234/MyService/etc/) đảm bảo rằng Bộ điều hợp nghe Net.Pipe Dịch vụ Windows là bắt đầu. (Tôi cũng đã bắt đầu Net.Tcp Listener Adaptor)

Dịch vụ này dường như không được kích hoạt hoặc bắt đầu trong một số trường hợp đặc biệt là khi triển khai đến một máy chủ từ xa có thể không có nhiều công cụ phát triển được cài đặt tích cực sử dụng các dịch vụ này. Bắt đầu dịch vụ đã khắc phục sự cố.

+0

Đó chính xác là vấn đề của tôi ... trang web của tôi đã hoạt động bình thường, rồi đột nhiên dừng lại. Bắt đầu dịch vụ và mọi thứ đều chạy tốt sau đó. – Arnaud

+0

Hallelujah! Đối với người đọc trong tương lai ::: Để cài đặt cửa sổ dịch vụ này, tôi tin rằng đường dẫn là ::: "Bật hoặc tắt tính năng Windows" /// ".NET Framework 4.6 Dịch vụ nâng cao" /// "WCF Services" /// "Đặt tên cho kích hoạt đường ống" (Nếu dịch vụ này không xuất hiện trong danh sách các cửa sổ-dịch vụ của bạn, bạn phải cài đặt nó). Cảm ơn! – granadaCoder