2009-12-29 5 views
26

ASMX 웹 서비스에 맞춤 인증 헤더를 추가 할 수있는 것처럼 basicHttpBinding의 WCF 수신/발신 메시지에 맞춤 SOAP 헤더를 추가 할 수 있습니까? 이러한 사용자 지정 SOAP 헤더는 .net 2.0/1.1 웹 서비스 클라이언트 (WSDL.EXE 도구로 액세스 가능)를 사용하여 액세스 할 수 있어야합니다.wcf에서 맞춤 비누 헤더를 추가하는 방법은 무엇입니까?

+0

메시지 감찰관에 대한 정보로 내 대답이 업데이트되었습니다. –

+0

SOAP 헤드셋에 대한 ASMX/WCF 상호 운용성에 대한 정보가 다시 업데이트되었습니다. –

+0

감사합니다. marc_s가 좋겠지 만 시험해 볼 것입니다. – nRk

답변

26

Codeplex의 WCF Extras을 확인하십시오. - 특히 사용자 정의 SOAP 헤더를 제공하는 WCF의 쉬운 확장 라이브러리입니다.

또 다른 옵션은 WCF 서비스에서 WCF message contracts을 사용하는 것입니다.이 옵션을 사용하면 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; 
} 

여기서 "연산"과 "transactionDate"는 SOAP 헤더로 정의됩니다.

이러한 방법 중 하나라도 도움이되지 않는다면 확장 기능으로 작성할 수있는 WCF 메시지 검사기의 개념을 확인해야합니다. 그들은 당신을 허용합니다. 클라이언트의 모든 발신 통화의 메시지에 특정 헤더를 삽입하고 사용하기 위해 서버의 메시지에서 메시지를 검색합니다.

메시지 관리자 작성 방법의 시작점과 프로젝트 설정에 포함하는 방법은 블로그 게시물 Handling custom SOAP headers via WCF Behaviors을 참조하십시오.

클라이언트 측 IClientMessageInspector는 두 가지 방법을 예 : BeforeSendReplyAfterReceiveRequestBeforeSendRequestAfterReceiveReply 및 서버 측 IDispatchMessageInspector 반대 방식을 갖는다을 정의한다.

이렇게하면 전선을 가로 지르는 모든 메시지에 헤더를 추가 할 수 있습니다. 여기

우리가 자동적으로 서버에 클라이언트의 로케일 정보를 통해 (언어와 문화 정보)를 전송하는 데 사용하는 IClientMessageInspector 구현에서 미리보기입니다 - 어떻게 시작하는 당신에게 아이디어를 줄 것이다 :

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; 
} 

서버 측에서는 그 헤더의 존재 유무를 확인한 다음 SOAP 헤더에서 해당 헤더를 추출하여 사용합니다.

UPDATE : - 좋은 소식은,이 여전히 잘 작동합니다 - 자세한 내용은이 블로그 게시물 Custom SOAP Headers: WCF and ASMX를 참조 좋아, 당신이있어 클라이언트는 WCF를 사용하여 .NET 2.0 하지에 있습니다. 서버 측의 메시지 관리자를 사용하여 .NET 2.0 클라이언트가 보내는 사용자 지정 헤더를 스니핑하고 추출 할 수 있습니다.

+0

감사합니다. marc_s, WCF Extras를 사용해 보았습니다. "XmlSerializerFormat"특성을 서비스 계약 WCF Extras에 추가하여 서비스에 액세스하는 동안 오류가 발생했습니다. WCF Extras와 같은 다른 솔루션이 있습니까? ASMX 서비스에서 SoapHeader를 추가 할 때 MessageContract를 모든 메소드에 속성으로 추가 할 수 있습니까? 내 요구 사항은 WCF 서비스에 대한 모든 호출에 대해 일부 (동일한 사용자 이름 및 암호) 데이터를 전송해야한다는 것입니다. 이 방법을 구현할 방법이 있습니까? – nRk

+0

yah marc_s, 멋지네요. 그러나 언급 된 기사에서 클라이언트는 .net 3.0 이상이어야합니다. 그러나 제 경우에는 클라이언트가 .net 2.0 및 1.1에 있습니다. 이 코드를 구현할 수 있습니까? – nRk

관련 문제