2010-03-31 30 views
16

Chúng ta phải truy cập vào một dịch vụ web có sử dụng soap11 ... không có vấn đề tôi sẽ chỉ thiết lập các ràng buộc như:Làm cách nào tôi có thể tạo liên kết tùy chỉnh này theo lập trình?

BasicHttpBinding wsBinding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential); 

Nope. Không có con xúc xắc. Vì vậy, tôi hỏi các máy chủ của dịch vụ tại sao chúng ta đang gặp vấn đề xác thực và ông nói rằng cấu hình của chúng tôi cần phải có những tùy chỉnh này ràng buộc:

<bindings> 
    <customBinding> 
     <binding name="lbinding"> 
      <security authenticationMode="UserNameOverTransport" 
       messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11" 
       securityHeaderLayout="Strict" 
       includeTimestamp="false" 
       requireDerivedKeys="true" 
       keyEntropyMode="ServerEntropy"> 
      </security> 
      <textMessageEncoding messageVersion="Soap11" /> 
      <httpsTransport authenticationScheme ="Negotiate" requireClientCertificate ="false" realm =""/> 
     </binding> 
    </customBinding> 
</bindings> 

Chỉ có vấn đề là chúng ta đang tạo ra ràng buộc của chúng tôi lập trình không thông qua config. Vì vậy, nếu ai đó có thể chỉ cho tôi đi đúng hướng liên quan đến việc thay đổi BasicHttpBinding của tôi thành một tùy chỉnh phù hợp với giá trị .config, tôi sẽ cung cấp cho họ một ngôi sao vàng sáng bóng lớn trong ngày.

Trả lời

28

Giải quyết!

Đây là mã chiến thắng cho những người đang ở trong tình trạng khó khăn tương tự.

Uri epUri = new Uri(_serviceUri); 
CustomBinding binding = new CustomBinding(); 
SecurityBindingElement sbe = SecurityBindingElement.CreateUserNameOverTransportBindingElement(); 
sbe.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11;   
sbe.SecurityHeaderLayout = SecurityHeaderLayout.Strict; 
sbe.IncludeTimestamp = false; 
sbe.SetKeyDerivation(true); 
sbe.KeyEntropyMode = System.ServiceModel.Security.SecurityKeyEntropyMode.ServerEntropy; 
binding.Elements.Add(sbe); 
binding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, System.Text.Encoding.UTF8)); 
binding.Elements.Add(new HttpsTransportBindingElement()); 
EndpointAddress endPoint = new EndpointAddress(epUri); 
+0

Cảm ơn điều này .. Tôi đã có một vấn đề tương tự mà tôi đã phải tạo một dự án lớp học có chứa logic để thực hiện một cuộc gọi dịch vụ bên ngoài. Tôi thực sự không (không thể) di chuyển cấu hình từ app.config đến web.config cơ bản - và vì vậy các giải pháp trên là hoàn hảo cho trường hợp này, để ghi đè lên định nghĩa dịch vụ. –

5

@D. Forrest đã tìm thấy giải pháp, nhưng một cách đơn giản để xem những gì các đối tượng có liên quan đến một cấu hình WCF nhất định là gọi .Endpoint.Binding.CreateBindingElements() trên proxy máy khách mà bạn đang sử dụng. Bạn có thể đổ cây đối tượng của mỗi mục trong danh sách được trả về và xem cách gắn kết được cấu hình.

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