게시된 WCF 서비스의 SOAP 헤더
WCF 수신 어댑터는 인바운드 메시지의 모든 SOAP 헤더 값을 InboundHeaders 속성에 복사하거나 지정된 값을 BizTalk 메시지 컨텍스트에 쓰거나 승격할 수 있습니다. 어댑터는 WS-Addressing, WS-Security, WS-AtomicTransaction 등 WCF 인프라가 사용하는 표준 SOAP 헤더와 사용자 지정 SOAP 헤더에서 모두 작동할 수 있습니다.
InboundHeaders 컨텍스트 속성은 대상 네임스페이스에 http://schemas.microsoft.com/BizTalk/2006/01/Adapters/WCF-properties
있으며 인바운드 메시지에서 SOAP 헤더 값의 문자열 표현을 포함합니다.
참고
지정한 SOAP 헤더 값을 승격하려는 경우 BizTalk 프로젝트에 승격할 값에 해당하는 배포된 속성 스키마가 있어야 합니다.
참고
승격 속성은 256자보다 길 수 없습니다.
다음 XML 데이터는 InboundHeaders 속성에 대한 SOAP 헤더의 문자열 표현 예제를 보여 줍니다. 이 데이터는 클라이언트에서 BizTalk 수신 위치로 전송됩니다.
<headers>
<a:Action s:mustUnderstand="1" xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">Operation_1</a:Action>
<SalesAgent xmlns="Microsoft.Samples.BizTalk.WCF.CustomSoapHeaderPipeline">Contoso</SalesAgent>
<a:MessageID xmlns:a="http://www.w3.org/2005/08/addressing">urn:uuid:26e6720f-5a82-4ef2-b597-6ef077bab92e</a:MessageID>
<a:ReplyTo xmlns:a="http://www.w3.org/2005/08/addressing"><a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo>
<a:To s:mustUnderstand="1" xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">net.tcp://localhost:9990/NetTcpOrderProcess</a:To>
</headers>
BizTalk 메시지 컨텍스트에 SOAP 헤더 값을 쓰거나 승격하려면 속성 이름 및 네임스페이스로 구성된 값 쌍의 컬렉션을 WCF 메시지에 넣어 WCF 어댑터가 헤더 값의 기록이나 승격을 인식하도록 해야 합니다. WCF 어댑터가 BizTalk 메시지 컨텍스트에 SOAP 헤더 값을 쓰거나 승격하려면 WCF 메시지에 다음 메시지 속성이 있어야 합니다.
SOAP 헤더 값을 BizTalk 메시지 컨텍스트로 승격하기 위해 WCF 어댑터는 키
http://schemas.microsoft.com/BizTalk/2006/01/Adapters/WCF-properties/Promote
와 값 목록<KeyValuePair<XmlQualifiedName 개체>> 쌍을 찾고 있습니다.WCF 어댑터는 이 쌍을 사용하여 XmlQualifiedName 개체의 네임스페이스, 이름 및 값을 가져와서 헤더 값을 승격하는 데 사용합니다.
SOAP 헤더 값을 BizTalk 메시지 컨텍스트로 작성하지만 승격하지 않도록 WCF 어댑터는 키
http://schemas.microsoft.com/BizTalk/2006/01/Adapters/WCF-properties/WriteToContext
와 값 List<KeyValuePair<XmlQualifiedName 개체>> 쌍을 찾고 있습니다.WCF 어댑터는 이 쌍을 사용하여 메시지 컨텍스트에 값을 씁니다.
다음 코드는 SOAP 헤더 값을 BizTalk 메시지 컨텍스트에 쓰거나 승격하는 방법을 보여 줍니다.
const string PropertiesToPromoteKey="http://schemas.microsoft.com/BizTalk/2006/01/Adapters/WCF-properties/Promote";
const string PropertiesToWriteKey="http://schemas.microsoft.com/BizTalk/2006/01/Adapters/WCF-properties/WriteToContext";
XmlQualifiedName PropName1=new XmlQualifiedName("Destination", "http://tempuri.org/2007/sample-properties");
XmlQualifiedName PropName2=new XmlQualifiedName("Source", "http://tempuri.org/2007/sample-properties");
//Create a List of KeyValuePairs that indicate properties to be promoted to BizTalk message context.
//A Property Schema must be deployed and string values have a limit of 256 characters
List<KeyValuePair<XmlQualifiedName, object>> promoteProps=new List<KeyValuePair<XmlQualifiedName, object>>();
promoteProps.Add(new KeyValuePair<XmlQualifiedName, object>(PropName1, "Property value"));
wcfMessage.Properties[PropertiesToPromoteKey]=promoteProps;
//Create a List of KeyValuePairs that indicate properties to be written to BizTalk message context
List<KeyValuePair<XmlQualifiedName, object>> writeProps=new List<KeyValuePair<XmlQualifiedName, object>>();
writeProps.Add(new KeyValuePair<XmlQualifiedName, object>(PropName2, "Property value"));
wcfMessage.Properties[PropertiesToWriteKey]=writeProps;
BizTalk WCF 서비스 게시 마법사는 생성된 메타데이터에 사용자 지정 SOAP 헤더 정의를 포함하지 않습니다. 사용자 지정 SOAP 헤더를 사용하여 WCF 서비스에 대한 메타데이터를 게시하려면 WSDL(웹 서비스 기술 언어) 파일을 수동으로 만들어야 합니다. 마법사에서 생성하는 Web.config 파일에서 serviceMetadata 요소의< externalMetadataLocation> 특성을 사용하여 WSDL 파일의 위치를 지정할 수 있습니다. WSDL 및 MEX(Metadata Exchange) 요청에 대한 응답으로 WSDL 파일이 자동 생성된 WSDL 대신 사용자에게 반환됩니다.
다음 XML 데이터는 사용자 지정 SOAP 헤더를 정의하는 WSDL 파일의 일부 예입니다.
<wsdl:operation name="Request">
<soap12:operation soapAction="http://Microsoft.Samples.BizTalk.NetTcpAdapter/OrderProcess/IOrderProcess/Request" style="document" />
<wsdl:input name="Order">
<soap12:header message="i0:Order_Headers" part="SalesAgent" use="literal" />
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output name="OrderConfirmation">
<soap12:header message="i0:OrderConfirmation_Headers" part="PaymentAgent" use="literal" />
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>