2009-12-29 28 views
26

Tôi có thể thêm tiêu đề SOAP tùy chỉnh trong các thư đến/đi WCF trong basicHttpBinding, như chúng ta có thể thêm tiêu đề xác thực tùy chỉnh trong các dịch vụ web ASMX không? Các tiêu đề SOAP tùy chỉnh này có thể truy cập được bằng cách sử dụng các trình khách dịch vụ web 2.0/1.1. (Có thể truy cập bằng công cụ WSDL.EXE).Làm cách nào để thêm tiêu đề xà phòng tùy chỉnh vào wcf?

+0

cập nhật câu trả lời của tôi với thông tin về thanh tra thư –

+0

cập nhật câu trả lời của tôi một lần nữa với thông tin về khả năng tương tác ASMX/WCF liên quan đến tiêu đề SOAP –

+0

cảm ơn marc_s, điều này có vẻ tốt, tôi sẽ dùng thử. – nRk

Trả lời

26

Kiểm tra WCF Extras trên Codeplex - đây là thư viện tiện ích mở rộng dễ dàng dành cho WCF cung cấp - trong số những thứ khác - tiêu đề SOAP tùy chỉnh.

Một tùy chọn khác là sử dụng WCF message contracts trong dịch vụ WCF của bạn - điều này cũng dễ dàng cho phép bạn xác định và đặt tiêu đề WCF SOAP.

[MessageContract] 
public class BankingTransaction 
{ 
    [MessageHeader] 
    public Operation operation; 
    [MessageHeader] 
    public DateTime transactionDate; 

    [MessageBodyMember] 
    private Account sourceAccount; 
    [MessageBodyMember] 
    private Account targetAccount; 
    [MessageBodyMember] 
    public int amount; 
} 

Ở đây, "hoạt động" và "transactionDate" được định nghĩa là tiêu đề SOAP.

Nếu không có phương pháp nào trong số đó giúp bạn, thì bạn nên kiểm tra khái niệm WCF Message Inspectors mà bạn có thể viết dưới dạng tiện ích mở rộng. Chúng cho phép bạn, ví dụ: tiêm các tiêu đề nhất định vào thư trên mọi cuộc gọi đi trên máy khách và truy xuất các thư đó từ thư trên máy chủ để bạn sử dụng.

Xem bài đăng trên blog này Handling custom SOAP headers via WCF Behaviors để biết điểm bắt đầu về cách viết trình kiểm tra thư và cách đưa nó vào thiết lập dự án của bạn.

Phía client IClientMessageInspector định nghĩa hai phương pháp BeforeSendRequestAfterReceiveReply trong khi phía máy chủ IDispatchMessageInspector có phương pháp ngược lại, ví dụ: AfterReceiveRequestBeforeSendReply.

Với điều này, bạn có thể thêm tiêu đề cho mọi thư đi qua dây (hoặc chỉ chọn lọc đến một số ít).

Dưới đây là một đoạn trích từ một implementor IClientMessageInspector chúng tôi sử dụng để Automagically truyền thông tin về vị (ngôn ngữ và thông tin văn hóa) đối diện với khách hàng đến máy chủ - nên cung cấp cho bạn một ý tưởng làm thế nào để bắt đầu:

public object BeforeSendRequest(ref Message request, IClientChannel channel) 
{ 
    International intlHeader = new International(); 
    intlHeader.Locale = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName; 

    MessageHeader header = MessageHeader.CreateHeader(WSI18N.ElementNames.International, WSI18N.NamespaceURI, intlHeader); 
    request.Headers.Add(header); 

    return null; 
} 

Ở phía máy chủ, sau đó bạn sẽ kiểm tra sự hiện diện của các tiêu đề đó và nếu có, hãy trích xuất chúng từ phong bì SOAP và sử dụng chúng.

UPDATE: okay, bạn khách hàng là trên .NET 2.0 và không sử dụng WCF - Tin tốt là, đây vẫn nên chỉ làm việc tốt - xem bài viết trên blog này Custom SOAP Headers: WCF and ASMX để biết chi tiết. Bạn vẫn có thể sử dụng thanh tra thư ở phía máy chủ để đánh hơi và trích xuất các tiêu đề tùy chỉnh được gửi bởi máy khách .NET 2.0 của bạn.

+0

Cảm ơn marc_s, tôi đã thử chúng tôi WCF Extras, tôi đã thêm thuộc tính "XmlSerializerFormat" vào Service Contract WCF Extras ném lỗi khi truy cập Dịch vụ. Có giải pháp nào khác có sẵn như WCF Extras không? Tôi có thể thêm MessageContract làm thuộc tính cho mọi phương thức như tôi đã thêm SoapHeader vào dịch vụ ASMX không? Yêu cầu của tôi là tôi cần phải gửi dữ liệu một số (cùng tên người dùng và mật khẩu) cho mọi cuộc gọi đến dịch vụ WCF. Có cách nào để thực hiện điều này không? – nRk

+0

yah marc_s, trông rất tuyệt. nhưng trong bài viết đề cập đến khách hàng nên có trong net 3.0 hoặc cao hơn .. nhưng trong trường hợp của tôi, khách hàng đang ở trong .net 2.0 & 1.1. Vẫn có thể thực hiện điều này? – nRk

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