2012-04-28 26 views
6

Có hai vấn đề tôi gặp phải vào tối hôm qua, nhưng tôi không chắc chắn 100% là tại sao những gì tôi đã làm đã giải quyết và hy vọng có thể ai đó có thể cung cấp cái nhìn sâu sắc như tôi đã chuyển qua rất nhiều đá và không có may mắn!Hai đường ống được đặt tên duy nhất xung đột và InvalidCredentialException

Đầu Vấn đề

Vấn đề đầu tiên là tôi có hai tên độc đáo Ống rằng trong hai chương trình riêng biệt:

  • net.pipe: // localhost/superuniquepipe1
  • ròng. pipe: // localhost/superuniquepipe2

Tuy nhiên, chương trình thứ hai để khởi chạy sẽ ném một ngoại lệ (I beli eve nó đã được AddressAlreadyInUseException) khi mở ServiceHost do địa chỉ đã được sử dụng.

Con đường tôi instantiating những ServiceHosts là như sau:

Uri[] baseAddresses = new Uri[] { new Uri("net.pipe://localhost") }; 
this.host = new ServiceHost(this, baseAddresses); 
this.host.AddServiceEndpoint(typeof(IHostType), new NetNamedPipeBinding(), "superuniquepipe1"); 
this.host.Open(); 

Vì vậy, tôi muốn xác định địa chỉ cơ sở của localhost đầu tiên, và sau đó xác định phần còn lại của nó khi thêm các thiết bị đầu cuối, đường Tôi đã giải quyết vấn đề này là thay đổi mã như sau:

this.host = new ServiceHost(this); 
this.host.AddServiceEndpoint(typeof(IHostType), new NetNamedPipeBinding(), "net.pipe://localhost/superuniquepipe2"); 
this.host.Open(); 

Tôi có chính xác vì lý do này là vì nó chỉ kiểm tra địa chỉ cơ sở chứ không phải điểm cuối tôi đang cố thêm? Và đang sử dụng mẫu mã thứ hai một cách hợp lệ/an toàn để có nhiều chương trình nghe trên "localhost"?

Second Vấn đề:

Trong một nỗ lực để sửa chữa ở trên, tôi đã thay đổi địa chỉ cơ sở từ localhost với một số chuỗi độc đáo khác nhau ví dụ "net.pipe: // rawrwhyisntthisworkingsadface", nhưng khi làm điều này tôi sẽ được trình bày với một InvalidCredentialException từ khách hàng cố gắng để thiết lập một kết nối (xem mã dưới đây)

Tôi đã ấn tượng một ống có tên theo nghĩa đen có thể đặt tên bất cứ điều gì, bất cứ ai có thể làm sáng tỏ điều này?

ChannelFactory<IHostType> factory = new ChannelFactory<IHostType>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://rawrwhyisntthisworkingsadface/superuniquepipe2")); 
IHostType proxy = factory.CreateChannel(); 
proxy.CallSomeMethodAndGetAnException(); 

Bất kỳ đầu vào sẽ được đánh giá rất nhiều, như tôi đã nói tôi đã giải quyết được vấn đề này và chỉ muốn biết tại sao giải pháp của tôi làm việc, nhưng nếu bạn nhìn thấy một lỗ hổng trong cách tôi đã giải quyết nó và có thể đề nghị một tốt hơn cách để làm việc đó xin vui lòng làm như vậy :)

+0

Để mở rộng về vấn đề này, tôi nhận được cùng một vấn đề I belive, và đây là ngoại lệ: ** [TYPE]: ** System.ServiceModel.AddressAlreadyInUseException ** [THÔNG ĐIỆP]: ** Can not lắng nghe tên đường ống 'net.pipe: // localhost /' vì một điểm cuối đường ống khác đã lắng nghe trên tên đó. – ebol2000

Trả lời

13

Re vấn đề 1:

các WCF NetNamedPipeBinding sử dụng một phần bộ nhớ chia sẻ được đặt tên để công bố cho các khách hàng của mình tên thực tế của các đường ống trên mà dịch vụ có thể được gọi. Tên đường ống chính nó là GUID, được tạo ra mỗi khi máy chủ dịch vụ được mở. Đây là tên của phần bộ nhớ dùng chung được sử dụng để xuất bản dịch vụ phụ thuộc vào URL dịch vụ. Nếu một địa chỉ cơ sở được xác định, địa chỉ cơ sở được sử dụng để lấy được tên này.

Điều này có nghĩa là bạn chỉ có thể có một ứng dụng dịch vụ WCF tại một thời điểm chạy sử dụng một địa chỉ cơ sở cụ thể cho các điểm cuối NetNamedPipe của nó.Nếu bạn cố gắng để bắt đầu một thứ hai, nó không thành công với AddressAlreadyInUseException vì nó thấy rằng tên WCF muốn sử dụng cho vị trí xuất bản (bắt nguồn từ địa chỉ cơ sở) đã được thực hiện bởi một ứng dụng khác.

Nếu bạn chỉ định không có địa chỉ cơ sở và cung cấp cho từng dịch vụ một URL dịch vụ tuyệt đối, duy nhất thì tên của vị trí xuất bản hiện được lấy từ URL tuyệt đối đầy đủ và không có xung đột giữa các ứng dụng. Đây là một cách hoàn toàn hợp lệ và an toàn để có nhiều WCF được gọi là dịch vụ đường ống nghe.

Re problem 2:

Ở phía dịch vụ, bạn có thể sử dụng bất kỳ thứ gì cho phần tên máy chủ của URL dịch vụ. Điều này là do cài đặt HostNameComparisonMode được áp dụng theo mặc định trong NetNamePipeBinding, vì thuật toán trong WCF lấy tên cho vị trí xuất bản bộ nhớ dùng chung thay thế ký tự đại diện cho tên máy chủ see here để bật chế độ so sánh tên máy chủ được định cấu hình. Tuy nhiên, ở phía khách hàng, URL dịch vụ bị hạn chế: phần máy chủ phải giải quyết thực sự cho máy chủ cục bộ (nghĩa là địa chỉ IP là localhost, đúng hoặc tên máy chính xác).

+0

Cảm ơn tất cả thông tin, được đánh giá cao :) – rastating

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