Language
Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
äžè¬ã«ãWindows Communication Foundation (WCF) ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ãããšãã«ãéçºè ã¯ããŒã¿æ§é ãšã·ãªã¢ã«åã®åé¡ã«ã¯çްå¿ã®æ³šæãæããŸãããããŒã¿ãéä¿¡ããã¡ãã»ãŒãžæ§é ã«ã€ããŠæžå¿µããå¿ èŠã¯ãããŸããã ãã®ãããªã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã©ã¡ãŒã¿ãŒãŸãã¯æ»ãå€çšã«ããŒã¿ ã³ã³ãã©ã¯ããäœæããã®ã¯ç°¡åã§ã (詳现ã«ã€ããŠã¯ãããµãŒãã¹ ã³ã³ãã©ã¯ãã§ã®ããŒã¿è»¢éã®æå®ããåç §ããŠãã ããã)
ãã ããSOAP ã¡ãã»ãŒãžã®æ§é ãå®å šã«å¶åŸ¡ããããšãã¡ãã»ãŒãžã®å 容ã®å¶åŸ¡ãšåæ§ã«éèŠãšãªãå ŽåããããŸãã ãããç¹ã«åœãŠã¯ãŸãã®ã¯ãçžäºéçšæ§ãéèŠã§ããå Žåãå ·äœçã«ã¯ã¡ãã»ãŒãžãŸãã¯ã¡ãã»ãŒãžéšåã®ã¬ãã«ã§ã»ãã¥ãªãã£ã®åé¡ãå¶åŸ¡ããå Žåã§ãã ãã®ãããªå Žåãå¿ èŠãšãããæ£ç¢ºãª SOAP ã¡ãã»ãŒãžã®æ§é ãæå®ã§ããã"ã¡ãã»ãŒãž ã³ã³ãã©ã¯ã" ãäœæã§ããŸãã
ããã§ã¯ãã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã®åçš®å±æ§ã䜿çšããŠããŠãŒã¶ãŒæäœã«å°çšã®ã¡ãã»ãŒãž ã³ã³ãã©ã¯ããäœæããæ¹æ³ã«ã€ããŠèª¬æããŸãã
åŠçã«ãããã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã®äœ¿çš
WCF ã§ã¯ã"ãªã¢ãŒã ããã·ãŒãžã£ ã³ãŒã« (RPC: Remote Procedure Call) ã¹ã¿ã€ã«"ããŸã㯠"ã¡ãã»ãŒãžã³ã° ã¹ã¿ã€ã«" ã§ã¢ãã«åãããæäœããµããŒããããŸãã RPC ã¹ã¿ã€ã«ã®æäœã§ã¯ãã·ãªã¢ã«åå¯èœãªä»»æã®åã䜿çšã§ããŸããè€æ°ã®ãã©ã¡ãŒã¿ãŒãref ãã©ã¡ãŒã¿ãŒãš out ãã©ã¡ãŒã¿ãŒãªã©ãããŒã«ã«åŒã³åºãã§äœ¿çšã§ããæ©èœãå©çšã§ããŸãã ãã®ã¹ã¿ã€ã«ã§ã¯ãéžæããã·ãªã¢ã«åã®åœ¢åŒã«ãã£ãŠåºã«ãªãã¡ãã»ãŒãžã®ããŒã¿æ§é ãå¶åŸ¡ãããŸãããŸããæäœããµããŒãããããã«ãã¡ãã»ãŒãžã¯ WCF ã©ã³ã¿ã€ã ã«ãã£ãŠäœæãããŸãã ããã«ãããSOAP ã SOAP ã¡ãã»ãŒãžã«äžæ
£ããªéçºè
ã§ãããµãŒãã¹ ã¢ããªã±ãŒã·ã§ã³ãè¿
éãã€å®¹æã«äœæãã䜿çšã§ããŸãã
RPC ã¹ã¿ã€ã«ã§ã¢ãã«åããããµãŒãã¹æäœã®ã³ãŒãäŸã次ã«ç€ºããŸãã
[OperationContract]
public BankingTransactionResponse PostBankingTransaction(BankingTransaction bt);
éåžžã¯ãããŒã¿ ã³ã³ãã©ã¯ãã ãã§ã¡ãã»ãŒãžã®ã¹ããŒããå®çŸ©ããããšãã§ããŸãã ããšãã°ãåã®äŸã§ã¯ãBankingTransaction ãš BankingTransactionResponse ã«ããŒã¿ ã³ã³ãã©ã¯ããããã°ãã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã§åºã«ãªã SOAP ã¡ãã»ãŒãžã®å
容ãå®çŸ©ã§ããŸãã ããŒã¿ ã³ã³ãã©ã¯ãã®è©³çްã«ã€ããŠã¯ããããŒã¿ ã³ã³ãã©ã¯ãã®äœ¿çšããåç
§ããŠãã ããã
ãã ããå Žåã«ãã£ãŠã¯ãSOAP ã¡ãã»ãŒãžã®æ§é ããããã¯ãŒã¯çµç±ã§ã©ã®ããã«è»¢éãããããå³å¯ã«å¶åŸ¡ããå¿ èŠããããŸãã æãäžè¬çãªã·ããªãªã¯ãã«ã¹ã¿ã SOAP ããããŒã®æ¿å ¥ã§ãã ãã 1 ã€ã®äžè¬çãªã·ããªãªã¯ãã¡ãã»ãŒãžã®ããããŒã𿬿ã®ã»ãã¥ãªã㣠ããããã£ãå®çŸ©ããããšãã€ãŸãããããã®èŠçŽ ã«ããžã¿ã«çœ²åããèŠçŽ ãæå·åãããã©ãããæ±ºå®ããããšã§ãã æåŸã«ãäžéšã®ãµãŒãããŒãã£ã® SOAP ã¹ã¿ãã¯ã§ã¯ãã¡ãã»ãŒãžãç¹å®ã®åœ¢åŒã§ããå¿ èŠããããŸãã ãã®å¶åŸ¡ã¯ãã¡ãã»ãŒãžã³ã° ã¹ã¿ã€ã«ã®æäœã«ãã£ãŠè¡ãããšãã§ããŸãã
ã¡ãã»ãŒãžã³ã° ã¹ã¿ã€ã«ã®æäœã«ã¯ãæå€§ã§ 1 ã€ã®ãã©ã¡ãŒã¿ãŒãš 1 ã€ã®æ»ãå€ããããŸãããããã¯ããããã¡ãã»ãŒãžåã§ããã€ãŸãããã©ã¡ãŒã¿ãŒãšæ»ãå€ã¯ãæå®ããã SOAP ã¡ãã»ãŒãžæ§é ã«çŽæ¥ã·ãªã¢ã«åãããŸãã ããã¯ãMessageContractAttribute åããŸã㯠Message åãšããŠããŒã¯ãããä»»æã®åã䜿çšã§ããŸãã æ¬¡ã®ã³ãŒãäŸã¯åã® RPC ã¹ã¿ã€ã«ãšåæ§ã®æäœã瀺ããŠããŸããããã®äŸã§ã¯ã¡ãã»ãŒãžã³ã° ã¹ã¿ã€ã«ã䜿çšããŠããŸãã
ããšãã°ãBankingTransaction ãš BankingTransactionResponse ãããããã¡ãã»ãŒãž ã³ã³ãã©ã¯ãåã§ããå Žåãæ¬¡ã®æäœã®ã³ãŒãã¯æå¹ã§ãã
[OperationContract]
BankingTransactionResponse Process(BankingTransaction bt);
[OperationContract]
void Store(BankingTransaction bt);
[OperationContract]
BankingTransactionResponse GetResponse();
ãã ããæ¬¡ã®ã³ãŒãã¯ç¡å¹ã§ãã
[OperationContract]
bool Validate(BankingTransaction bt);
// Invalid, the return type is not a message contract.
[OperationContract]
void Reconcile(BankingTransaction bt1, BankingTransaction bt2);
// Invalid, there is more than one parameter.
ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãåãå«ãæäœã§ãæå¹ãªãã¿ãŒã³ (æš¡åŒ) ã«åŸããªããã¹ãŠã®å Žåã«äŸå€ãã¹ããŒãããŸãã ãã¡ãããã¡ãã»ãŒãž ã³ã³ãã©ã¯ãåãå«ãŸãªãåŠçã«ã¯ãã®ãããªå¶éã¯ãããŸããã
1 ã€ã®åã«ã¡ãã»ãŒãž ã³ã³ãã©ã¯ããšããŒã¿ ã³ã³ãã©ã¯ãã®äž¡æ¹ãå«ãŸããå Žåã¯ãåŠçã§ãã®åã䜿çšããããšãã«ã¯ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã ããèæ ®ãããŸãã
ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã®å®çŸ©
åã®ã¡ãã»ãŒãž ã³ã³ãã©ã¯ããå®çŸ©ãã (ã€ãŸããåãš SOAP ãšã³ãããŒãéã®ãããã³ã°ãå®çŸ©ãã) ã«ã¯ãMessageContractAttribute ãåã«é©çšããŸãã æ¬¡ã«ãSOAP ããããŒã«ããåã®ã¡ã³ããŒã« MessageHeaderAttribute ãé©çšããã¡ãã»ãŒãžã® SOAP æ¬æã®äžéšã«ããã¡ã³ããŒã« MessageBodyMemberAttribute ãé©çšããŸãã
ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã®äœ¿çšäŸã次ã®ã³ãŒãã«ç€ºããŸãã
[MessageContract]
public class BankingTransaction
{
[MessageHeader] public Operation operation;
[MessageHeader] public DateTime transactionDate;
[MessageBodyMember] private Account sourceAccount;
[MessageBodyMember] private Account targetAccount;
[MessageBodyMember] public int amount;
}
ãã®åãæäœãã©ã¡ãŒã¿ãŒãšããŠäœ¿çšãããšã次㮠SOAP ãšã³ãããŒããçæãããŸãã
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:operation xmlns:h="http://tempuri.org/" xmlns="http://tempuri.org/">Deposit</h:operation>
<h:transactionDate xmlns:h="http://tempuri.org/" xmlns="http://tempuri.org/">2012-02-16T16:10:00</h:transactionDate>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<BankingTransaction xmlns="http://tempuri.org/">
<amount>0</amount>
<sourceAccount xsi:nil="true"/>
<targetAccount xsi:nil="true"/>
</BankingTransaction>
</s:Body>
</s:Envelope>
operationãštransactionDate㯠SOAP ããããŒãšããŠè¡šç€ºãããSOAP æ¬æã¯ãBankingTransactionãsourceAccountãããã³targetAccountãå«ãã©ãããŒèŠçŽ amountã§æ§æãããŠããããšã«æ³šæããŠãã ããã
ãããªãã¯ããã©ã€ããŒããä¿è·ããŸãã¯å éšã®ãããã§ãããã«é¢ä¿ãªããMessageHeaderAttribute ãš MessageBodyMemberAttribute ã¯ããã¹ãŠã®ãã£ãŒã«ããããããã£ãããã³ã€ãã³ãã«é©çšã§ããŸãã
MessageContractAttribute ã䜿çšãããšãSOAP ã¡ãã»ãŒãžã®æ¬æã®ã©ãããŒèŠçŽ ã®ååãå¶åŸ¡ãã WrapperName ããã³ WrapperNamespace 屿§ãæå®ã§ããŸãã æ¢å®ã§ã¯ãã¡ãã»ãŒãž ã³ã³ãã©ã¯ãåã®ååã¯ã©ãããŒçšã«äœ¿çšãããã¡ãã»ãŒãž ã³ã³ãã©ã¯ããå®çŸ©ãããŠããåå空é (http://tempuri.org/) ã¯æ¢å®ã®åå空éãšããŠäœ¿çšãããŸãã
泚
KnownTypeAttribute 屿§ã¯ãã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã§ã¯ç¡èŠãããŸãã KnownTypeAttribute ãå¿ èŠãªå Žåã¯ã察象ã®ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã䜿çšããŠããåŠçã§ãããèšå®ããŸãã
ããããŒåãæ¬æåãããã³åå空éã®å¶åŸ¡
ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã® SOAP 衚çŸã§ã¯ãåããããŒã𿬿ã®åéšåãååãšåå空éãæã€ XML èŠçŽ ã«ããããããŸãã
æ¢å®ã§ã¯ãåå空éã¯ã¡ãã»ãŒãžãåå ããŠãããµãŒãã¹ ã³ã³ãã©ã¯ãã®åå空éãšåãã§ããããã®åå㯠MessageHeaderAttribute 屿§ãŸã㯠MessageBodyMemberAttribute 屿§ãå²ãåœãŠãããã¡ã³ããŒåã«ãã£ãŠæ±ºå®ãããŸãã
(MessageContractMemberAttribute.Name 屿§ãš MessageContractMemberAttribute.Namespace 屿§ã®èŠªã¯ã©ã¹ã®) MessageHeaderAttribute ããã³ MessageBodyMemberAttribute ãæäœããããšã«ãã£ãŠããããã®æ¢å®å€ã倿Žã§ããŸãã
次ã®ã³ãŒãäŸã®ã¯ã©ã¹ã«ã€ããŠèããŠã¿ãŸãã
[MessageContract]
public class BankingTransaction
{
[MessageHeader] public Operation operation;
[MessageHeader(Namespace="http://schemas.contoso.com/auditing/2005")] public bool IsAudited;
[MessageBodyMember(Name="transactionData")] public BankingTransactionData theData;
}
ãã®äŸã§ã¯ãIsAudited ããããŒãã³ãŒãã§æå®ãããåå空éã«ååšããtheData ã¡ã³ããŒãè¡šãæ¬æã transactionData ãšããååã® XML èŠçŽ ã«ãã£ãŠè¡šçŸãããŸãã æ¬¡ã«ããã®ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãçšã«çæããã XML ã瀺ããŸãã
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:IsAudited xmlns:h="http://schemas.contoso.com/auditing/2005" xmlns="http://schemas.contoso.com/auditing/2005">false</h:IsAudited>
<h:operation xmlns:h="http://tempuri.org/" xmlns="http://tempuri.org/">Deposit</h:operation>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<AuditedBankingTransaction xmlns="http://tempuri.org/">
<transactionData/>
</AuditedBankingTransaction>
</s:Body>
</s:Envelope>
SOAP æ¬æã®ããŒããã©ãããããã©ããã®å¶åŸ¡
SOAP æ¬æã¯ãããã©ã«ãã§ã©ããèŠçŽ å
ã«ã·ãªã¢ã«åãããŸãã ããšãã°ãHelloGreetingMessage ã¡ãã»ãŒãžã®ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã«å«ãŸãã MessageContractAttribute åã®ååããçæããã HelloGreetingMessage ã©ãããŒèŠçŽ ãæ¬¡ã®ã³ãŒãã«ç€ºããŸãã
[MessageContract]
public class HelloGreetingMessage
{
private string localGreeting;
[MessageBodyMember(
Name = "Salutations",
Namespace = "http://www.examples.com"
)]
public string Greeting
{
get { return localGreeting; }
set { localGreeting = value; }
}
}
/*
The following is the request message, edited for clarity.
<s:Envelope>
<s:Header>
<!-- Note: Some header content has been removed for clarity.
<a:Action>http://GreetingMessage/Action</a:Action>
<a:To s:mustUnderstand="1"></a:To>
</s:Header>
<s:Body u:Id="_0" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<HelloGreetingMessage xmlns="Microsoft.WCF.Documentation">
<Salutations xmlns="http://www.examples.com">Hello.</Salutations>
</HelloGreetingMessage>
</s:Body>
</s:Envelope>
*/
<MessageContract> _
Public Class HelloGreetingMessage
Private localGreeting As String
<MessageBodyMember(Name:="Salutations", Namespace:="http://www.examples.com")> _
Public Property Greeting() As String
Get
Return localGreeting
End Get
Set(ByVal value As String)
localGreeting = value
End Set
End Property
End Class
'
' The following is the request message, edited for clarity.
'
' <s:Envelope>
' <s:Header>
' <!-- Note: Some header content has been removed for clarity.
' <a:Action>http://GreetingMessage/Action</a:Action>
' <a:To s:mustUnderstand="1"></a:To>
' </s:Header>
' <s:Body u:Id="_0" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
' <HelloGreetingMessage xmlns="Microsoft.WCF.Documentation">
' <Salutations xmlns="http://www.examples.com">Hello.</Salutations>
' </s:Body>
' </s:Envelope>
'
ã©ãããŒèŠçŽ ãæå¶ããã«ã¯ãIsWrapped ããããã£ã false ã«èšå®ããŸãã ã©ãããŒèŠçŽ ã®ååãšåå空éãå¶åŸ¡ããã«ã¯ãWrapperName ããããã£ãš WrapperNamespace ããããã£ã䜿çšããŸãã
泚
ã©ãããããŠããªãã¡ãã»ãŒãžã«ã¡ãã»ãŒãžæ¬æã®è€æ°ã®éšåãå«ããããšã¯ãWS-I Basic Profile 1.1 èŠæ Œã«åãããããæ°ããã¡ãã»ãŒãž ã³ã³ãã©ã¯ããèšèšããå Žåã¯ãå§ãã§ããŸããã ãã ããç¹å®ã®çžäºéçšã·ããªãªã§ã¯ãè€æ°ã®ã©ãããããŠããªãã¡ãã»ãŒãžæ¬æãå¿ èŠãªå ŽåããããŸãã 1 ã€ã®ã¡ãã»ãŒãžæ¬æã§è€æ°ã®ããŒã¿ã転éããå Žåã¯ãæ¢å®ã® (ã©ããããã) ã¢ãŒãã䜿çšããããšããå§ãããŸãã ã©ãããããŠããªãã¡ãã»ãŒãžã§è€æ°ã®ã¡ãã»ãŒãž ããããŒã䜿çšããŠããäœã®åé¡ããããŸããã
ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãå éšã§ã®ã«ã¹ã¿ã åã®äœ¿çš
ã¡ãã»ãŒãžã䜿çšããããµãŒãã¹ ã³ã³ãã©ã¯ãçšã«éžæãããã·ãªã¢ã«åãšã³ãžã³ã䜿çšããŠãåã
ã®ã¡ãã»ãŒãž ããããŒãšã¡ãã»ãŒãžæ¬æãã·ãªã¢ã«åãããŸã (XML ã«å€æãããŸã)ã æ¢å®ã®ã·ãªã¢ã«åãšã³ãžã³ã§ãã XmlFormatter ã¯ãããŒã¿ ã³ã³ãã©ã¯ããæã€ä»»æã®åã (System.Runtime.Serialization.DataContractAttribute ãæã€ããšã«ãã£ãŠ) æç€ºçã«åŠçããããšãã(ããªããã£ãåã«ããããSystem.SerializableAttribute ãæã£ããããããšãªã©ã«ãã£ãŠ) æé»çã«åŠçããããšãã§ããŸãã 詳现ã«ã€ããŠã¯ããããŒã¿ ã³ã³ãã©ã¯ãã®äœ¿çšããåç
§ããŠãã ããã
åã®äŸã§ã¯ãOperation åãš BankingTransactionData åã¯ãããŒã¿ ã³ã³ãã©ã¯ããæã€å¿
èŠããããŸãããŸããtransactionDate ãããªããã£ãã§ãã (ãããã£ãŠãæé»ã®ããŒã¿ ã³ã³ãã©ã¯ããæã€) ãããDateTime ã¯ã·ãªã¢ã«åå¯èœã§ãã
ãã ããå¥ã®ã·ãªã¢ã«åãšã³ãžã³ã§ãã XmlSerializer ã«åãæ¿ããããšãã§ããŸãã ãã®ãããªåãæ¿ããè¡ãå Žåã¯ãã¡ãã»ãŒãž ããããŒã𿬿ã®åéšåã«äœ¿çšãããŠãããã¹ãŠã®åã XmlSerializer ã䜿çšããŠã·ãªã¢ã«åå¯èœã§ããããšã確èªããå¿
èŠããããŸãã
ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãå éšã§ã®é åã®äœ¿çš
ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã§ã¯ãå埩èŠçŽ ã®é åã 2 ãšããã®æ¹æ³ã§äœ¿çšã§ããŸãã
æåã®æ¹æ³ã¯ãé åäžã§ MessageHeaderAttribute ãŸã㯠MessageBodyMemberAttribute ãçŽæ¥äœ¿çšããæ¹æ³ã§ãã ãã®å Žåã¯ãé åå šäœãè€æ°ã®åèŠçŽ ãå«ã 1 ã€ã®èŠçŽ (ã€ãŸãã1 ã€ã®ããããŒãŸã㯠1 ã€ã®æ¬æ) ãšããŠã·ãªã¢ã«åãããŸãã æ¬¡ã®äŸã®ã¯ã©ã¹ã«ã€ããŠèããŠã¿ãŸãã
[MessageContract]
public class BankingDepositLog
{
[MessageHeader] public int numRecords;
[MessageHeader] public DepositRecord[] records;
[MessageHeader] public int branchID;
}
ããã«ãããæ¬¡ã®ãã㪠SOAP ããããŒãçµæãšããŠçæãããŸãã
<BankingDepositLog>
<numRecords>3</numRecords>
<records>
<DepositRecord>Record1</DepositRecord>
<DepositRecord>Record2</DepositRecord>
<DepositRecord>Record3</DepositRecord>
</records>
<branchID>20643</branchID>
</BankingDepositLog>
ãã 1 ã€ã®æ¹æ³ã¯ãMessageHeaderArrayAttribute ã䜿çšããæ¹æ³ã§ãã ãã®å Žåãåé åèŠçŽ ãåå¥ã«ã·ãªã¢ã«åããããããæ¬¡ã®ããã«é åèŠçŽ ããšã« 1 ã€ã®ããããŒãä»å ãããŸãã
<numRecords>3</numRecords>
<records>Record1</records>
<records>Record2</records>
<records>Record3</records>
<branchID>20643</branchID>
é åãšã³ããªã®æ¢å®ã®ååã¯ãMessageHeaderArrayAttribute 屿§ãé©çšãããã¡ã³ããŒã®ååã«ãªããŸãã
MessageHeaderArrayAttribute 屿§ã¯ãMessageHeaderAttribute ããç¶æ¿ãããŸãã ãã®å±æ§ã¯ãéé
å屿§ãšåãæ©èœã»ãããæã¡ãŸããããšãã°ãåäžã®ããããŒã«èšå®ããã®ãšåæ§ã«ãããããŒã®é
åã«é åºãååãããã³åå空éãèšå®ã§ããŸãã é
åã§ Order ããããã£ã䜿çšãããšããã®é
åå
šäœã«é©çšãããŸãã
MessageHeaderArrayAttribute ãé©çšã§ããã®ã¯é åã ãã§ãããã³ã¬ã¯ã·ã§ã³ã«ã¯é©çšã§ããŸããã
ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã§ã®ãã€ãé åã®äœ¿çš
ãã€ãé åãéé å屿§ (MessageBodyMemberAttribute ãš MessageHeaderAttribute) ã§äœ¿çšããå Žåã¯ãé åãšããŠã§ã¯ãªããçæããã XML å ã§ Base64 ã§ãšã³ã³ãŒããããããŒã¿ãšããŠè¡šçŸãããç¹æ®ãªããªããã£ãåãšããŠæ±ãããŸãã
MessageHeaderArrayAttribute é
å屿§ã§ãã€ãé
åã䜿çšããå Žåãçµæã¯äœ¿çšããŠããã·ãªã¢ã©ã€ã¶ãŒã«ãã£ãŠç°ãªããŸãã æ¢å®ã®ã·ãªã¢ã©ã€ã¶ãŒã§ã¯ãé
åãåã
ã®ãã€ã ãšã³ããªãšããŠè¡šãããŸãã ãã ãã(ãµãŒãã¹ ã³ã³ãã©ã¯ãã® XmlSerializer ã䜿çšããŠ) XmlSerializerFormatAttribute ãéžæããå Žåã¯ãé
å屿§ãšéé
å屿§ã®ã©ã¡ãã䜿çšããŠãããã«é¢ä¿ãªãããã€ãé
å㯠Base64 ããŒã¿ãšããŠæ±ãããŸãã
ã¡ãã»ãŒãžã®äžéšã®çœ²åãšæå·å
ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã§ã¯ãã¡ãã»ãŒãžã®ããããŒãŸãã¯æ¬æã«ããžã¿ã«çœ²åããæå·åãããã©ããã瀺ãããšãã§ããŸãã
ãã®æäœã¯ãMessageContractMemberAttribute.ProtectionLevel 屿§ãš MessageHeaderAttribute 屿§ã® MessageBodyMemberAttribute ããããã£ãèšå®ããããšã«ãã£ãŠå®è¡ãããŸãã ãã®ããããã£ã¯ãSystem.Net.Security.ProtectionLevel åã®åæäœã§ãããNone (æå·åãšçœ²åãè¡ããªã)ãSign (ããžã¿ã«çœ²åã ããè¡ã)ããŸã㯠EncryptAndSign (æå·åãšããžã¿ã«çœ²åã®äž¡æ¹ãè¡ã) ã«èšå®ã§ããŸãã æ¢å®ã§ã¯ã EncryptAndSignã§ãã
ãããã®ã»ãã¥ãªãã£æ©èœã䜿çšããã«ã¯ããã€ã³ãã£ã³ã°ãšåäœãé©åã«æ§æããå¿ èŠããããŸãã é©åãªæ§æãè¡ããã«ãããã®ã»ãã¥ãªãã£æ©èœã䜿çšããå Žå (è³æ Œæ å ±ãæå®ããã«ã¡ãã»ãŒãžã«çœ²åããããšããå Žåãªã©)ãæ€èšŒæã«äŸå€ãã¹ããŒãããŸãã
ã¡ãã»ãŒãž ããããŒã®å ŽåãããããŒããšã«ä¿è·ã¬ãã«ãèšå®ãããŸãã
ã¡ãã»ãŒãžæ¬æã®åéšåã«ã€ããŠã¯ãä¿è·ã¬ãã«ããæå°ã®ä¿è·ã¬ãã«ããšããŠèããããšãã§ããŸããæ¬æã¯ãéšåã®æ°ã«ãããããã1ã€ã®ä¿è·ã¬ãã«ããæã¡ãŸããã å šäœã®ä¿è·ã¬ãã«ã¯ã身äœã®åéšäœã®äžã§æãé«ãProtectionLevelããããã£èšå®ã«ãã£ãŠæ±ºå®ãããŸãã åéšåã®ä¿è·ã¬ãã«ã¯ãå®éã«å¿ èŠãšãããæå°éã®ä¿è·ã¬ãã«ã«èšå®ããã¹ãã§ãã
次ã®ã³ãŒãäŸã®ã¯ã©ã¹ã«ã€ããŠèããŠã¿ãŸãã
[MessageContract]
public class PatientRecord
{
[MessageHeader(ProtectionLevel=None)] public int recordID;
[MessageHeader(ProtectionLevel=Sign)] public string patientName;
[MessageHeader(ProtectionLevel=EncryptAndSign)] public string SSN;
[MessageBodyMember(ProtectionLevel=None)] public string comments;
[MessageBodyMember(ProtectionLevel=Sign)] public string diagnosis;
[MessageBodyMember(ProtectionLevel=EncryptAndSign)] public string medicalHistory;
}
ãã®äŸã§ã¯ãrecordID ããããŒã¯ä¿è·ããããpatientName ã¯signedã§ãããSSN ã¯æå·åããã³çœ²åãããŸãã æ¬æã® comments ãš diagnosis ã®åéšåã§ã¯äœãä¿è·ã¬ãã«ãæå®ããŠããŠããæ¬æã®å°ãªããšã 1 ã€ã®éšå (medicalHistory) ã« EncryptAndSign ãé©çšãããŠãããããã¡ãã»ãŒãžæ¬æå
šäœãæå·åããã眲åãããŸãã
SOAP ã¢ã¯ã·ã§ã³
SOAP æšæºãšé¢é£ãã Web ãµãŒãã¹æšæºã§ã¯ãéä¿¡ããããã¹ãŠã® SOAP ã¡ãã»ãŒãžã«èšå®å¯èœãª Action ãšããååã®ããããã£ãå®çŸ©ãããŸãã ãã®ããããã£ã®å€ã¯ãæäœã® OperationContractAttribute.Action ããããã£ãš OperationContractAttribute.ReplyAction ããããã£ã«ãã£ãŠå¶åŸ¡ãããŸãã
SOAP ããããŒã®å±æ§
SOAP æšæºã§ã¯ãããããŒã«èšå®å¯èœãªæ¬¡ã®å±æ§ãå®çŸ©ãããŸãã
Actor/Role(SOAP 1.1 ã§ã¯ActorãSOAP 1.2 ã§ã¯Role)MustUnderstandRelay
Actor 屿§ãŸã㯠Role 屿§ã¯ãæå®ã®ããããŒã察象ãšããããŒãã® URI (Uniform Resource Identifier) ãæå®ããŸãã
MustUnderstand 屿§ã¯ãããããŒåŠçããŒããããããŒãèªèããå¿
èŠããããã©ãããæå®ããŸãã
Relay 屿§ã¯ãããŠã³ã¹ããªãŒã ããŒãã«ããããŒãäžç¶ããå¿
èŠããããã©ãããæå®ããŸãã WCF ã§ã¯ã(ãã®ãããã¯ã®åŸåã®ãã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã®ããŒãžã§ã³ç®¡çãã»ã¯ã·ã§ã³ã§ç€ºãããŠããããã«) MustUnderstand 屿§ãé€ããŠãåä¿¡ã¡ãã»ãŒãžã«å¯ŸããŠãããã®å±æ§ã®åŠçã¯å®è¡ãããŸããã ãã ããåŸè¿°ããããã«ãå¿
èŠã«å¿ããŠãããã®å±æ§ãèªã¿æžãããããšãã§ããŸãã
æ¢å®ã§ã¯ãã¡ãã»ãŒãžã®éä¿¡æã«ãããã®å±æ§ã¯åºåãããŸããã ããã¯ã2 ãšããã®æ¹æ³ã§å€æŽã§ããŸãã 1 ã€ç®ã®æ¹æ³ãšããŠã次ã®ã³ãŒãäŸã«ç€ºãããã«ãMessageHeaderAttribute.ActorãMessageHeaderAttribute.MustUnderstandãããã³ MessageHeaderAttribute.Relay ã®åããããã£ã倿Žããããšã«ãã£ãŠã屿§ãå¿
èŠãªå€ã«éçã«èšå®ã§ããŸã (Role ããããã£ãååšããªãããšã«æ³šæããŠãã ãããSOAP 1.2 ã䜿çšããŠããå Žåã¯ãActor ããããã£ãèšå®ãããš Role 屿§ãåºåãããŸã)ã
[MessageContract]
public class BankingTransaction
{
[MessageHeader(Actor="http://auditingservice.contoso.com", MustUnderstand=true)] public bool IsAudited;
[MessageHeader] public Operation operation;
[MessageBodyMember] public BankingTransactionData theData;
}
ãããã®å±æ§ãå¶åŸ¡ãã 2 çªç®ã®æ¹æ³ã¯ãã³ãŒããéããŠåçã«è¡ãæ¹æ³ã§ãã ãããè¡ãã«ã¯ãå¿ èŠãªããããŒã®åã MessageHeader<T> åã«ã©ããã (ãã®åãšéãžã§ããªã㯠ããŒãžã§ã³ãæ··åããªãããã«ããŠãã ãã)ããã®åã MessageHeaderAttribute ãšå ±ã«äœ¿çšããŸãã ããã§ã次ã®ã³ãŒãäŸã«ç€ºãããã«ãMessageHeader<T> ã®ããããã£ã䜿çšã㊠SOAP 屿§ãèšå®ã§ããããã«ãªããŸãã
[MessageContract]
public class BankingTransaction
{
[MessageHeader] public MessageHeader<bool> IsAudited;
[MessageHeader] public Operation operation;
[MessageBodyMember] public BankingTransactionData theData;
}
// application code:
BankingTransaction bt = new BankingTransaction();
bt.IsAudited = new MessageHeader<bool>();
bt.IsAudited.Content = false; // Set IsAudited header value to "false"
bt.IsAudited.Actor="http://auditingservice.contoso.com";
bt.IsAudited.MustUnderstand=true;
åçå¶åŸ¡æ©æ§ãšéçå¶åŸ¡æ©æ§ã®äž¡æ¹ã䜿çšããå Žåãéçãªèšå®ãæ¢å®ã§äœ¿çšãããŸãããæ¬¡ã®ã³ãŒãã«ç€ºãããã«ãåŸã§åçæ©æ§ã䜿çšããŠéçãªèšå®ããªãŒããŒã©ã€ãã§ããŸãã
[MessageHeader(MustUnderstand=true)] public MessageHeader<Person> documentApprover;
// later on in the code:
BankingTransaction bt = new BankingTransaction();
bt.documentApprover = new MessageHeader<Person>();
bt.documentApprover.MustUnderstand = false; // override the static default of 'true'
次ã®ã³ãŒãã«ç€ºãããã«ã屿§ãåçã«å¶åŸ¡ããŠç¹°ãè¿ãããããŒãäœæã§ããŸãã
[MessageHeaderArray] public MessageHeader<Person> documentApprovers[];
åä¿¡åŽã§ãMessageHeader<T> ã¯ã©ã¹ããã®åã®ããããŒã§äœ¿çšãããŠããå Žåã«ã®ã¿ããããã® SOAP 屿§ã®èªã¿åããå®è¡ã§ããŸãã åä¿¡ã¡ãã»ãŒãžã®å±æ§èšå®ãæããã«ããããã«ãActor åã®ããããŒã® RelayãMustUnderstandããŸã㯠MessageHeader<T> ã®åããããã£ã調ã¹ãŸãã
ã¡ãã»ãŒãžãåä¿¡ããåŸã«è¿ä¿¡ãããšãSOAP ã®å±æ§èšå®ã¯ MessageHeader<T> åã®ããããŒã§ã®ã¿åŸåŸ©ããŸãã
SOAP ããã£ããŒãã®é åº
ç¶æ³ã«ãã£ãŠã¯ãããã£éšã®åéšåã®é åºã管çããå¿ èŠããããŸãã æ¬æèŠçŽ ã®æ¢å®ã®é åºã¯ã¢ã«ãã¡ãããé ã§ãããMessageBodyMemberAttribute.Order ããããã£ã§å¶åŸ¡ã§ããŸãã ãã®ããããã£ã®ã»ãã³ãã£ã¯ã¹ã¯ãç¶æ¿ã·ããªãªã«ãããåäœãé€ããDataMemberAttribute.Order ããããã£ã®ã»ãã³ãã£ã¯ã¹ãšåãã§ã (ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã§ã¯ã掟çåã®æ¬æã¡ã³ããŒã®åã«åºæ¬åã®æ¬æã¡ã³ããŒãäžŠã¹æ¿ããããããšã¯ãããŸãã)ã 詳现ã«ã€ããŠã¯ããããŒã¿ ã¡ã³ããŒã®é åºããåç §ããŠãã ããã
次ã®äŸã§ã¯ãéåžžã¯ã¢ã«ãã¡ãããé ã§æåã§ãã amount ãå
é ã«ããŸããã
Order ããããã£ã«ãã£ãŠ 3 çªç®ã®äœçœ®ã«æ¿å
¥ãããŸãã
[MessageContract]
public class BankingTransaction
{
[MessageHeader] public Operation operation;
[MessageBodyMember(Order=1)] public Account sourceAccount;
[MessageBodyMember(Order=2)] public Account targetAccount;
[MessageBodyMember(Order=3)] public int amount;
}
ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã®ããŒãžã§ã³ç®¡ç
å Žåã«ãã£ãŠã¯ãã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã倿Žããå¿ èŠããããŸãã ããšãã°ãæ°ããããŒãžã§ã³ã®ã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠã¡ãã»ãŒãžã«äœåãªããããŒã远å ãããå Žåã§ãã ãã®å Žåãæ°ããããŒãžã§ã³ããå€ãããŒãžã§ã³ã«éä¿¡ãããšãã¯ãã·ã¹ãã ã¯äœåãªããããŒãåŠçããéæ¹åã«éä¿¡ãããšãã¯äžè¶³ããŠããããããŒãåŠçããå¿ èŠããããŸãã
ããããŒã®ããŒãžã§ã³ç®¡çã«ã¯ã次ã®ã«ãŒã«ãé©çšãããŸãã
WCF ã§ã¯ãäžè¶³ããŠããããããŒã¯åé¡ã«ãããŸããã察å¿ããã¡ã³ããŒã¯æ¢å®å€ã§æ®ãããŸãã
WCF ã§ã¯ãäºæããªãäœåãªããããŒãç¡èŠãããŸãã ãã®ã«ãŒã«ã® 1 ã€ã®äŸå€ã¯ãå ¥å SOAP ã¡ãã»ãŒãžå ã®äœåãªããããŒã®
MustUnderstand屿§ãtrueã«èšå®ãããŠããå Žåã§ãããã®å Žåãèªèããå¿ èŠã®ããããããŒãåŠçã§ããªããããäŸå€ãã¹ããŒãããŸãã
ã¡ãã»ãŒãžæ¬æã«ãåæ§ã®ããŒãžã§ã³ç®¡çã«ãŒã«ããããŸããã¡ãã»ãŒãžæ¬æã®äžè¶³ããŠããéšåãšè¿œå ãããéšåã¯ããããç¡èŠãããŸãã
ç¶æ¿ã«é¢ããçæç¹
ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãåã¯ãåºæ¬åãã¡ãã»ãŒãž ã³ã³ãã©ã¯ããæã£ãŠããéããä»ã®åããç¶æ¿ããããšãã§ããŸãã
ä»ã®ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãåããç¶æ¿ããã¡ãã»ãŒãž ã³ã³ãã©ã¯ãåã䜿çšããŠãã¡ãã»ãŒãžãäœæããããã¡ãã»ãŒãžã«ã¢ã¯ã»ã¹ãããããå Žåãæ¬¡ã®ã«ãŒã«ãé©çšãããŸãã
ç¶æ¿éå±€å ã®ãã¹ãŠã®ã¡ãã»ãŒãž ããããŒãåéããããã®ã¡ãã»ãŒãžã®å®å šãªããã㌠ã»ããã圢æãããŸãã
ç¶æ¿éå±€å ã®ãã¹ãŠã®ã¡ãã»ãŒãžæ¬æãåéãããå®å šãªã¡ãã»ãŒãžæ¬æã圢æãããŸãã æ¬æã®åéšåã¯ãç¶æ¿éå±€å ã§ã®äœçœ®ã«é¢ä¿ãªããéåžžã®é åºã«ãŒã« (MessageBodyMemberAttribute.Order ããããã£é ãç¶ããŠã¢ã«ãã¡ãããé ) ã«åŸã£ãŠäžŠã¹ãããŸãã ã¡ãã»ãŒãžæ¬æãç¶æ¿ããªãŒã®è€æ°ã¬ãã«ã«ååšããã¡ãã»ãŒãž ã³ã³ãã©ã¯ãç¶æ¿ã®äœ¿çšã¯ãããŸããå§ãã§ããŸããã åºæ¬ã¯ã©ã¹ãšæŽŸçã¯ã©ã¹ã§ããããŒãŸãã¯æ¬æã«åãååãå®çŸ©ãããŠããå Žåã¯ãbase-most ã¯ã©ã¹ããã®ã¡ã³ããŒããã®ããããŒãŸãã¯æ¬æã®å€ãä¿åããããã«äœ¿çšãããŸãã
次ã®ã³ãŒãäŸã®ã¯ã©ã¹ã«ã€ããŠèããŠã¿ãŸãã
[MessageContract]
public class PersonRecord
{
[MessageHeader(Name="ID")] public int personID;
[MessageBodyMember] public string patientName;
}
[MessageContract]
public class PatientRecord : PersonRecord
{
[MessageHeader(Name="ID")] public int patientID;
[MessageBodyMember] public string diagnosis;
}
PatientRecord ã¯ã©ã¹ã¯ãID ãšããååã® 1 ã€ã®ããããŒãæã€ã¡ãã»ãŒãžãèšè¿°ããŸãã ãã®ããããŒã¯ãbase-most ã¡ã³ããŒãéžæãããããšã«ãã£ãŠãpersonID ã¡ã³ããŒã«ã¯å¯Ÿå¿ããŸãããpatientID ã¡ã³ããŒã«ã¯å¯Ÿå¿ããŸããã ãã®ããããã®å Žå㯠patientID ãã£ãŒã«ãã¯äœ¿çšãããŸããã ã¡ãã»ãŒãžæ¬æã«ã¯ãã¢ã«ãã¡ãããé ã§ãdiagnosis èŠçŽ ã®æ¬¡ã« patientName èŠçŽ ãå«ãŸããŸãã ãã®äŸã¯ãåºæ¬ã¡ãã»ãŒãž ã³ã³ãã©ã¯ããšæŽŸçã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã®äž¡æ¹ã«ã¡ãã»ãŒãžæ¬æãå«ãŸããããŸããå§ãã§ããªããã¿ãŒã³ã瀺ããŠããããšã«æ³šæããŠãã ããã
WSDL ã«é¢ããçæç¹
ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã䜿çšãããµãŒãã¹ãã Web ãµãŒãã¹èšè¿°èšèª (WSDL: Web Services Description Language) ã³ã³ãã©ã¯ããçæãããšãã«ã¯ãã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã®ãã¹ãŠã®æ©èœãçµæã® WSDL ã«åæ ãããããã§ã¯ãªãããšã«çæããŠãã ããã æ¬¡ã®ç¹ãèæ ®ããŸãã
WSDL ã§ã¯ãããããŒé åã®æŠå¿µã衚çŸããããšãã§ããŸããã MessageHeaderArrayAttribute ã䜿çšããŠããããŒé åãå«ãã¡ãã»ãŒãžãäœæããå Žåãçµæã® WSDL ã¯é åã§ã¯ãªã 1 ã€ã®ããããŒã ãã«åæ ãããŸãã
çµæã® WSDL ããã¥ã¡ã³ãã«äžéšã®ä¿è·ã¬ãã«æ å ±ãåæ ãããªãå ŽåããããŸãã
WSDL ã§çæãããã¡ãã»ãŒãžåããã¡ãã»ãŒãž ã³ã³ãã©ã¯ãåã®ã¯ã©ã¹ãšåãååã«ãªããŸãã
è€æ°ã®åŠçã§åãã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã䜿çšãããšãWSDL ããã¥ã¡ã³ãå ã«è€æ°ã®ã¡ãã»ãŒãžåãçæãããŸãã 以éã䜿çšã§ããããã«ã"2"ã"3" ãªã©ã®çªå·ãä»å ããããšã§ååãäžæã«ããŸãã WSDL ãã€ã³ããŒããçŽããšãåå以å€ã¯åäžã®è€æ°ã®ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãåãäœæãããŸãã
SOAP ãšã³ã³ãŒãã«é¢ããçæç¹
WCF ã§ã¯ãXML ã®ã¬ã¬ã· SOAP ãšã³ã³ãŒã ã¹ã¿ã€ã«ã䜿çšã§ããŸãããããã䜿çšããããšã¯ãå§ãããŸããã (ãµãŒãã¹ ã³ã³ãã©ã¯ãã«é©çšãããŠãã Use ã§ãEncoded ããããã£ã System.ServiceModel.XmlSerializerFormatAttribute ã«èšå®ããŠ) ãã®ã¹ã¿ã€ã«ã䜿çšããå Žåãæ¬¡ã®è¿œå ã®èæ
®äºé
ãé©çšãããŸãã
ã¡ãã»ãŒãž ããããŒã¯ãµããŒããããŸãããã€ãŸããMessageHeaderAttribute 屿§ãš MessageHeaderArrayAttribute é å屿§ã¯ãSOAP ãšã³ã³ãŒãã£ã³ã°ãšäºææ§ããããŸããã
ã¡ãã»ãŒãž ã³ã³ãã©ã¯ããã©ãããããŠããªãå Žåãã€ãŸããIsWrapped ããããã£ã
falseã«èšå®ãããŠããå Žåã¯ãã¡ãã»ãŒãž ã³ã³ãã©ã¯ããæã€ããšã®ã§ããæ¬æã®éšå㯠1 ã€ã«éãããŸããèŠæ±ã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã®ã©ãããŒèŠçŽ ã®ååã¯ãæäœã®ååãšäžèŽããå¿ èŠããããŸãã ãã®å Žåãã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã®
WrapperNameããããã£ã䜿çšããŸããå¿çã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã®ã©ãããŒèŠçŽ ã®ååã¯ãæäœã®ååã«ãµãã£ãã¯ã¹ãšã㊠"Response" ãä»ãããã®ãšåãã§ããå¿ èŠããããŸãã ãã®å Žåãã¡ãã»ãŒãž ã³ã³ãã©ã¯ãã® WrapperName ããããã£ã䜿çšããŸãã
SOAP ãšã³ã³ãŒãã¯ãªããžã§ã¯ãåç §ãä¿åããŸãã äŸãã°ã次ã®ã³ãŒããèããŠãã ããã
[MessageContract(WrapperName="updateChangeRecord")] public class ChangeRecordRequest { [MessageBodyMember] Person changedBy; [MessageBodyMember] Person changedFrom; [MessageBodyMember] Person changedTo; } [MessageContract(WrapperName="updateChangeRecordResponse")] public class ChangeRecordResponse { [MessageBodyMember] Person changedBy; [MessageBodyMember] Person changedFrom; [MessageBodyMember] Person changedTo; } // application code: ChangeRecordRequest cr = new ChangeRecordRequest(); Person p = new Person("John Doe"); cr.changedBy=p; cr.changedFrom=p; cr.changedTo=p;
SOAP ãšã³ã³ãŒãã£ã³ã°ã䜿çšããŠã¡ãã»ãŒãžãã·ãªã¢ã«åããåŸãchangedFrom ãš changedTo ã«ã¯ p ã®ã³ããŒã¯ä¿åãããŸãããã代ããã«ãchangedBy èŠçŽ å
éšã®ã³ããŒããã€ã³ããããŸãã
ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé
ãã¹ãŠã®ã¡ãã»ãŒãž ããããŒãšã¡ãã»ãŒãžæ¬æãåå¥ã«ã·ãªã¢ã«åãããŸãã ãããã£ãŠãããããŒããã³æ¬æããšã«åãåå空éãç¹°ãè¿ã宣èšãããå¯èœæ§ããããŸãã ã¡ãã»ãŒãžã®åç·äžã®ãµã€ãºãç¹ã«èæ ®ããŠããã©ãŒãã³ã¹ãæ¹åããã«ã¯ãè€æ°ã®ããããŒãšæ¬äœéšåãåäžã®ããããŒãŸãã¯æ¬äœéšåã«çµ±åããŸãã ããšãã°ã次ã®ã³ãŒãã®ä»£ããã«
[MessageContract]
public class BankingTransaction
{
[MessageHeader] public Operation operation;
[MessageBodyMember] public Account sourceAccount;
[MessageBodyMember] public Account targetAccount;
[MessageBodyMember] public int amount;
}
次ã®ã³ãŒãã䜿çšããŸãã
[MessageContract]
public class BankingTransaction
{
[MessageHeader] public Operation operation;
[MessageBodyMember] public OperationDetails details;
}
[DataContract]
public class OperationDetails
{
[DataMember] public Account sourceAccount;
[DataMember] public Account targetAccount;
[DataMember] public int amount;
}
ã€ãã³ã ããŒã¹ã®éåæãšã¡ãã»ãŒãž ã³ã³ãã©ã¯ã
ã€ãã³ã ããŒã¹ã®éåæã¢ãã«ã®ãã¶ã€ã³ ã¬ã€ãã©ã€ã³ã«ã¯ãè€æ°ã®å€ãè¿ãå Žåã«ã1 ã€ã®å€ã Result ããããã£ãšããŠè¿ããæ®ãã®å€ã EventArgs ãªããžã§ã¯ãã®ããããã£ãšããŠè¿ãããšãèšèŒãããŠããŸãã ãã® 1 ã€ã®çµæãšããŠãã¯ã©ã€ã¢ã³ããã€ãã³ã ããŒã¹ã®éåæã³ãã³ã ãªãã·ã§ã³ã䜿çšããŠã¡ã¿ããŒã¿ãã€ã³ããŒãããæäœããè€æ°ã®å€ãè¿ãããå Žåãæ¢å®ã® EventArgs ãªããžã§ã¯ã㯠1 ã€ã®å€ã Result ããããã£ãšããŠè¿ããæ®ãã®å€ã¯ EventArgs ãªããžã§ã¯ãã®ããããã£ã«ãªããŸãã
ã¡ãã»ãŒãž ãªããžã§ã¯ãã Result ããããã£ãšããŠåãåããè¿ãããå€ããã®ãªããžã§ã¯ãã®ããããã£ãšããŠååŸããå Žåã¯ã/messageContract ã³ãã³ã ãªãã·ã§ã³ã䜿çšããŸãã ããã«ãããResult ãªããžã§ã¯ãã® EventArgs ããããã£ãšããŠå¿çã¡ãã»ãŒãžãè¿ãã·ã°ããã£ãçæãããŸãã ãã¹ãŠã®å
éšæ»ãå€ã¯ãå¿çã¡ãã»ãŒãž ãªããžã§ã¯ãã®ããããã£ã«ãªããŸãã