WCF ¤Ç¤Ï¡¢Îã³°¤ò°ì¸µÅª¤Ë¥Ï¥ó¥É¥ê¥ó¥°¤¹¤ë¤¿¤á¤Îµ¡¹½¤¬Ê̤ÎÊýË¡¤ÇÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£
Global.asax ¤ËÈæ¤Ù¤Æ¡¢¼ê½ç¤¬¤ä¤äÌÌÅݤȤʤê¤Þ¤¹¤¬¡¢¥¯¥é¥¤¥¢¥ó¥È¤Ë¥Õ¥©¡¼¥ë¥È¥á¥Ã¥»¡¼¥¸¤òÄÌÃΤ¹¤ë¤³¤È¤ò¹Íθ¤·¤¿»ÅÁȤߤˤϤʤäƤ¤¤Þ¤¹¡£
¡Ú IErrorHandler ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹ ¡Û
Îã³°¤ò°ì¸µ¥Ï¥ó¥É¥ê¥ó¥°¤¹¤ë¤Î¤Ï¡¢ IErrorHandler ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹ (System.ServiceModel.Dispatcher) ¤ò¼ÂÁõ¤·¤¿ÆÈ¼«¤Î¥¯¥é¥¹¤È¤Ê¤ê¤Þ¤¹¡£
¤³¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤¬Ä󶡤¹¤ë¥á¥½¥Ã¥É¤Ï°Ê²¼¤Î£²¤Ä¤Ç¤¹¡£
[ ProvideFault ¥á¥½¥Ã¥É ]
ProvideFault ¥á¥½¥Ã¥É ¤Ï¡¢¥µ¡¼¥Ó¥¹ÆâÉô¤«¤é¥¹¥í¡¼¤µ¤ì¤¿Îã³°¤ò¥Ï¥ó¥É¥ê¥ó¥°¤·¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥ÉÆâ¤Ç¥¯¥é¥¤¥¢¥ó¥È¤ËÅϤ¹¥Õ¥©¡¼¥ë¥È¥á¥Ã¥»¡¼¥¸¤òÀ¸À®¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¥í¥®¥ó¥°¤Ê¤É¤Î½èÍý¤Ï¤³¤Î¥á¥½¥Ã¥É¤Ç¤Ï¤Ê¤¯¡¢¸å½Ò¤Î HandleError ¥á¥½¥Ã¥É¤Ç¹Ô¤¤¤Þ¤¹¡£
¤³¤Î¥á¥½¥Ã¥É¤Î¥Ñ¥é¥á¡¼¥¿¤Ï°Ê²¼¤Î£³¤Ä¤Ç¤¹¡£
error
·¿¤Ï Exception ¥¯¥é¥¹ (System) ¤Ç¤¹¡£
¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Ë¤è¤ê¡¢¥µ¡¼¥Ó¥¹ÆâÉô¤«¤é¥¹¥í¡¼¤µ¤ì¤¿Îã³°¤ò¼èÆÀ¤Ç¤¤Þ¤¹¡£
version
·¿¤Ï MessageVersion ¥¯¥é¥¹ (System.ServiceModel.Channels) ¤Ç¤¹¡£
¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Ë¤è¤ê¡¢¸½ºß¤Î SOAP ÄÌ¿® ¤Ë¤ª¤±¤ë SOAP ¤Î¥Ð¡¼¥¸¥ç¥ó¤ò¼èÆÀ¤Ç¤¤Þ¤¹¡£
fault
·¿¤Ï Message ¥¯¥é¥¹ (System.ServiceModel.Channels) ¤Ç¤¹¡£¤Þ¤¿¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Ï»²¾ÈÅϤ·¤È¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
¥µ¡¼¥Ó¥¹ÆâÉô¤«¤é¥¹¥í¡¼¤µ¤ì¤¿Îã³°¤¬¡¢ FaultException ¥¯¥é¥¹ (System.ServiceModel) ¤Ç¤¢¤Ã¤¿¾ì¹ç¡¢¤½¤ì¤òɽ¤ï¤¹¥Õ¥©¡¼¥ë¥È ¥á¥Ã¥»¡¼¥¸¤¬¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Ë¤è¤ê¼èÆÀ¤Ç¤¤Þ¤¹¡£¥µ¡¼¥Ó¥¹ÆâÉô¤«¤é¥¹¥í¡¼¤µ¤ì¤¿Îã³°¤¬¡¢ FaultException ¥¯¥é¥¹¤Ç¤Ê¤¤¾ì¹ç¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Ï null ¤È¤Ê¤ê¤Þ¤¹¡£
¤³¤Î ProvideFault ¥á¥½¥Ã¥ÉÆâ¤Ç Message ¥¯¥é¥¹¤òÀ¸À®¤·¤Æ¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤ËÀßÄꤹ¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥¯¥é¥¤¥¢¥ó¥È¤ËÅϤ¹¥Õ¥©¡¼¥ë¥È¥á¥Ã¥»¡¼¥¸¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤¤ë¤ï¤±¤Ç¤¹¡£
¡¦ProvideFault ¥á¥½¥Ã¥É¤Î¼ÂÁõÎã
FaultException °Ê³°¤Î¡¢¥Ï¥ó¥É¥ë¤µ¤ì¤Ê¤«¤Ã¤¿Îã³°¤¬È¯À¸¤·¤¿¾ì¹ç¤Ë¡¢Í½´ü¤»¤Ì¥¨¥é¡¼¤¬È¯À¸¤·¤¿¤È¤¤¤¦ÄÌÃΤò¥¯¥é¥¤¥¢¥ó¥È¤ËÂФ·¤Æ¹Ô¤¦¤¿¤á¤Î¼ÂÁõÎã¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
if (fault != null)
{
return;
}
FaultReasonText[] reasonTexts =
new FaultReasonText[]
{
new FaultReasonText("ͽ´ü¤»¤Ì¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿¡£", "ja-JP"),
new FaultReasonText("An unexpected error occurred.", "en-US")
};
FaultReason reason = new FaultReason(reasonTexts);
FaultCode code = FaultCode.CreateReceiverFaultCode("unexpected", "http://schemas.yokoken.net/Hoge");
FaultException faultException = new FaultException(reason, code);
MessageFault messageFault = faultException.CreateMessageFault();
string action = OperationContext.Current.IncomingMessageHeaders.Action;
fault = Message.CreateMessage(version, messageFault, action);
}
[ HandleError ¥á¥½¥Ã¥É ]
HandleError ¥á¥½¥Ã¥É ¤Ï¡¢¥µ¡¼¥Ó¥¹ÆâÉô¤«¤é¥¹¥í¡¼¤µ¤ì¤¿Îã³°¤È¡¢ÄÌ¿®»þ¤ËȯÀ¸¤·¤¿Îã³°¤ò¥Ï¥ó¥É¥ê¥ó¥°¤·¤Þ¤¹¡£
¥µ¡¼¥Ó¥¹ÆâÉô¤«¤é¥¹¥í¡¼¤µ¤ì¤¿Îã³°¤Ï¡¢ProvideFault ¥á¥½¥Ã¥É¤¬Àè¤Ë¥Ï¥ó¥É¥ê¥ó¥°¤·¤Þ¤¹¡£¤½¤Î¸å¡¢¤³¤Î¥á¥½¥Ã¥É¤¬¥Ï¥ó¥É¥ê¥ó¥°¤·¤Þ¤¹¡£ProvideFault ¥á¥½¥Ã¥É¤Ç¥Õ¥©¡¼¥ë¥È ¥á¥Ã¥»¡¼¥¸¤òÀ¸À®¤·¤¿¾ì¹ç¤Ç¤â¡¢HandleError ¥á¥½¥Ã¥É¤Ç¥Ï¥ó¥É¥ê¥ó¥°¤µ¤ì¤ëÎã³°¤ÏÊѤï¤ê¤Þ¤»¤ó¡£¤Ä¤Þ¤ê¡¢¥µ¡¼¥Ó¥¹ÆâÉô¤Ç¥¹¥í¡¼¤µ¤ì¤¿Îã³°¤¬¥Ï¥ó¥É¥ê¥ó¥°¤µ¤ì¤Þ¤¹¡£
¥í¥®¥ó¥°¤ä¡¢MSMQ ¤Îͳ²¥á¥Ã¥»¡¼¥¸ ( Poison Message ) ¤Î½èÍý¤Ê¤É¤Ï¤³¤Î¥á¥½¥Ã¥É¤Ç¹Ô¤¤¤Þ¤¹¡£
¤³¤Î¥á¥½¥Ã¥É¤Î¥Ñ¥é¥á¡¼¥¿¤Ï°Ê²¼¤Î£±¤Ä¤Ç¤¹¡£
error
·¿¤Ï Exception ¥¯¥é¥¹ (System) ¤Ç¤¹¡£
¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Ë¤è¤ê¡¢¥µ¡¼¥Ó¥¹ÆâÉô¤«¤é¥¹¥í¡¼¤µ¤ì¤¿Îã³°¤ä¡¢ÄÌ¿®»þ¤ËȯÀ¸¤·¤¿Îã³°¤ò¼èÆÀ¤Ç¤¤Þ¤¹¡£
¡¦Ìá¤êÃͤˤĤ¤¤Æ
¤³¤Î¥á¥½¥Ã¥É¤ÎÌá¤êÃÍ¤Ï bool ·¿¤ÎÃͤǤ¹¡£true ¤òÊÖ¤·¤¿¾ì¹ç¡¢Îã³°¤Ï¥Ï¥ó¥É¥ë¤µ¤ì¤¿¤â¤Î¤È¤·¤Æ°·¤ï¤ì¡¢false ¤òÊÖ¤·¤¿¾ì¹ç¡¢Îã³°¤Ï¥Ï¥ó¥É¥ë¤µ¤ì¤Ê¤«¤Ã¤¿¤â¤Î¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£
MSMQ ¤Çͳ²¥á¥Ã¥»¡¼¥¸¤ò½èÍý¤·¤¿Åù¤Î¾ì¹ç¤Ï¡¢¤³¤³¤Ç true ¤òÊÖ¤·¤Þ¤¹¡£²¿¤â½èÍý¤·¤Ê¤«¤Ã¤¿¤ê¡¢¥í¥®¥ó¥°¤Î¤ß¤ò¹Ô¤¦¾ì¹ç¤Ï false ¤òÊÖ¤·¤Þ¤¹¡£
( ¤¿¤À¡¢ÀµÄ¾¤ÊÏᢤ³¤ì¤é¤Î¶ñÂÎŪ¤Ê°ã¤¤¤ÏÉÔÌÀ¤Ç¤¹¡£¿§¡¹»î¤·¤Æ¤ß¤Þ¤·¤¿¤¬¡¢ true ¤òÊÖ¤·¤Æ¤â false ¤òÊÖ¤·¤Æ¤â¡¢µóư¤Î°ã¤¤¤Ï¸«¼õ¤±¤é¤ì¤Þ¤»¤ó¤Ç¤·¤¿¡£Reflector ¤Ç¥³¡¼¥É¤òÇÁ¤¤¤Æ¤ß¤ë¤È¡¢°ì±þÆÃÄê¤Î¾ò·ï²¼¤Ë¤ª¤¤¤Æ false ¤¬ÊÖ¤µ¤ì¤¿¾ì¹ç¤Ë¡¢¥Á¥ã¥Í¥ë¤ÎÃæ»ß½èÍý¤ò¹Ô¤¦¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤è¤¦¤Ç¤¹¡£ )
¡¦HandleError ¥á¥½¥Ã¥É¤Î¼ÂÁõÎã
FaultException °Ê³°¤Î¡¢¥Ï¥ó¥É¥ë¤µ¤ì¤Ê¤«¤Ã¤¿Îã³° ( ÄÌ¿®»þ¤ÎÎã³°´Þ¤à ) ¤¬È¯À¸¤·¤¿¾ì¹ç¤Ë¡¢Îã³°¤Î¾ðÊó¤ò¥³¥ó¥½¡¼¥ë¤Ø½ÐÎϤ¹¤ë¤¿¤á¤Î¼ÂÁõÎã¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£
public bool HandleError(Exception error)
{
if (error is FaultException)
{
return false;
}
string errorType = error.GetType().FullName;
string errorMessage = error.Message;
string errorStackTrace = error.StackTrace;
Console.WriteLine("[ Error ]\r\nType: {0}\r\nMessage: {1}\r\nStack Trace: {2}", errorType, errorMessage, errorStackTrace);
return false;
}
¡Ú ¥¨¥é¡¼ ¥Ï¥ó¥É¥é¤ÎÅÐÏ¿ ¡Û
[ ChannelDispatcher ¤ØÅÐÏ¿ ]
IErrorHandler ¼ÂÁõ¥¯¥é¥¹¤òÄêµÁ¤·¤¿¤À¤±¤Ç¤Ï¡¢¥¨¥é¡¼ ¥Ï¥ó¥É¥é¤È¤·¤ÆÆ°ºî¤·¤Æ¤¯¤ì¤Þ¤»¤ó¡£IErrorHandler ¼ÂÁõ¥¯¥é¥¹¤òÅÐÏ¿¤¹¤ë½èÍý¤ò¼ÂÁõ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
ÅÐÏ¿¤Ï¡¢ChannelDispatcher ¥¯¥é¥¹ (System.ServiceModel.Dispatcher) ¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Î¡¢ErrorHandlers ¥×¥í¥Ñ¥Æ¥£ ¤ËÂФ·¤Æ¹Ô¤¤¤Þ¤¹¡£¤³¤Î¥×¥í¥Ñ¥Æ¥£¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¥³¥ì¥¯¥·¥ç¥ó¥ª¥Ö¥¸¥§¥¯¥È¤ËÂФ·¤ÆIErrorHandler ¼ÂÁõ¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÄɲ䷤Ƥä¤ê¤Þ¤¹¡£
ServiceHostBase ¥¯¥é¥¹ (System.ServiceModel) ¤Î ChannelDispatchers ¥×¥í¥Ñ¥Æ¥£ ¤Ë¤Ï¡¢ChannelDispatcherCollection ¥¯¥é¥¹ (System.ServiceModel.Dispatcher) ¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤¬³ÊǼ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤Î¥³¥ì¥¯¥·¥ç¥ó¤«¤é¡¢ChannelDispatcher ¥ª¥Ö¥¸¥§¥¯¥È¤ò¼èÆÀ¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤³¤Î¥³¥ì¥¯¥·¥ç¥ó¼«ÂΤϡ¢ChannelDispatcherBase ¥¯¥é¥¹ (System.ServiceModel.Channels) ¤Î¥³¥ì¥¯¥·¥ç¥ó¤È¤·¤ÆÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ChannelDispatcherBase ¥¯¥é¥¹¤Ï¡¢ChannelDispacher ¥¯¥é¥¹¤Î´ðËÜ¥¯¥é¥¹¤Ç¤¹¤¬¡¢ErrorHandlers ¥×¥í¥Ñ¥Æ¥£¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤Ä¤Þ¤ê¡¢ChannelDispacher ¥¯¥é¥¹¤Ø¤Î¥¥ã¥¹¥È¤¬¹Ô¤¨¤ë¤«¸¡¾Ú¤·¡¢¥¥ã¥¹¥È¤ò¹Ô¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ ( ¤¿¤À¡¢ChannelDispatcherBase ¥¯¥é¥¹¤ÏÃê¾Ý¥¯¥é¥¹¤Ç¤¢¤ê¡¢¤³¤Î¥¯¥é¥¹¤ÎÇÉÀ¸¥¯¥é¥¹¤Ï ChannelDispacher ¥¯¥é¥¹¤·¤«¤¢¤ê¤Þ¤»¤ó¡£¤Ä¤Þ¤ê¡¢»ö¼Â¾åChannelDispatcherCollection ¥¯¥é¥¹¤Ï ChannelDispacher ¤Î¥³¥ì¥¯¥·¥ç¥ó¤Ç¤¹¡£¤·¤«¤·¡¢¤½¤ì¤Ç¤â¥¥ã¥¹¥È¤¬¤Ç¤¤ë¤«¤É¤¦¤«¤Î¸¡¾Ú¤Ï¤·¤Ã¤«¤ê¹Ô¤¦¤³¤È¤ò¿ä¾©¤·¤Þ¤¹¡£ )
[ ÅÐÏ¿¤Ï¥µ¡¼¥Ó¥¹ ¥Ó¥Ø¥¤¥Ó¥¢¤Ç¹Ô¤¦ ]
ÅÐÏ¿½èÍý¤ÏÆÈ¼«¤Î¥Ó¥Ø¥¤¥Ó¥¢¤Ç¹Ô¤¤¤Þ¤¹¡£¥Ó¥Ø¥¤¥Ó¥¢¤«¤é¤Ç¤Ï¤Ê¤¯¡¢¥µ¡¼¥Ó¥¹ ¥Û¥¹¥È¤òľÀÜÁàºî¤·¤ÆÅÐÏ¿½èÍý¤ò¹Ô¤Ã¤Æ¤â¡¢¥¨¥é¡¼ ¥Ï¥ó¥É¥é¤Ïưºî¤·¤Æ¤¯¤ì¤Þ¤»¤ó¡£
¥Ó¥Ø¥¤¥Ó¥¢¤Ï¥µ¡¼¥Ó¥¹ ¥Ó¥Ø¥¤¥Ó¥¢¤Þ¤¿¤Ï¥¨¥ó¥É¥Ý¥¤¥ó¥È ¥Ó¥Ø¥¤¥Ó¥¢¤È¤Ê¤ê¤Þ¤¹¡£
ÆÈ¼«¤Î¥Ó¥Ø¥¤¥Ó¥¢¤òÄêµÁ¤¹¤ëÊýË¡¤Ë¤Ä¤¤¤Æ¤Ï°Ê²¼¤Îµ»ö¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
ÆÈ¼«¤Î¥Ó¥Ø¥¤¥Ó¥¢¤òÄêµÁ¤¹¤ë
ÆÈ¼«¤Î¥Ó¥Ø¥¤¥Ó¥¢¤òÄêµÁ¤¹¤ë £²
¡Ú ¼ÂÁõÎã ¡Û
¥¨¥é¡¼ ¥Ï¥ó¥É¥é¤Î¼ÂÁõÎã¤È¡¢¤½¤ì¤òŬÍѤ¹¤ë¤¿¤á¤Î¥µ¡¼¥Ó¥¹ ¥Ó¥Ø¥¤¥Ó¥¢¤Î¼ÂÁõÎã¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£
¥¨¥é¡¼ ¥Ï¥ó¥É¥é
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Dispatcher;
internal sealed class ErrorHandler : IErrorHandler
{
public bool HandleError(Exception error)
{
if (error is FaultException)
{
return false;
}
string errorType = error.GetType().FullName;
string errorMessage = error.Message;
string errorStackTrace = error.StackTrace;
Console.WriteLine("[ Error ]\r\nType: {0}\r\nMessage: {1}\r\nStack Trace: {2}", errorType, errorMessage, errorStackTrace);
return false;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
if (fault != null)
{
return;
}
FaultReasonText[] reasonTexts =
new FaultReasonText[]
{
new FaultReasonText("ͽ´ü¤»¤Ì¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿¡£", "ja-JP"),
new FaultReasonText("An unexpected error occurred.", "en-US")
};
FaultReason reason = new FaultReason(reasonTexts);
FaultCode code = FaultCode.CreateReceiverFaultCode("unexpected", "http://schemas.yokoken.net/Hoge");
FaultException faultException = new FaultException(reason, code);
MessageFault messageFault = faultException.CreateMessageFault();
string action = OperationContext.Current.IncomingMessageHeaders.Action;
fault = Message.CreateMessage(version, messageFault, action);
}
}
¥µ¡¼¥Ó¥¹ ¥Ó¥Ø¥¤¥Ó¥¢
using System;
using System.Collections.ObjectModel;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Description;
[AttributeUsage(AttributeTargets.Class)]
public class ErrorHandlerAttribute : Attribute, IServiceBehavior
{
private IErrorHandler errorHandler;
public ErrorHandlerAttribute()
{
this.errorHandler = new ErrorHandler();
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcherBase dispatcherBase in serviceHostBase.ChannelDispatchers)
{
ChannelDispatcher dispatcher = dispatcherBase as ChannelDispatcher;
if (dispatcher == null)
{
continue;
}
dispatcher.ErrorHandlers.Add(this.errorHandler);
}
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
}
¤³¤ì¤Ç¡¢¥µ¡¼¥Ó¥¹ ¥¯¥é¥¹¤Ë ErrorHandlerAttribute ¥¯¥é¥¹¤ò°À¤È¤·¤ÆÉղ乤ì¤Ð¡¢¥µ¡¼¥Ó¥¹¤Ë¥¨¥é¡¼ ¥Ï¥ó¥É¥é¤¬Å¬ÍѤµ¤ì¤Þ¤¹¡£
¥³¥ó¥Õ¥£¥®¥å¥ì¡¼¥·¥ç¥ó¤ä¥³¡¼¥É¤«¤é¡¢¥µ¡¼¥Ó¥¹¥Û¥¹¥È¤ËÂФ·¤Æ¥Ó¥Ø¥¤¥Ó¥¢¤òŬÍѤ¹¤ëÊýË¡¤Ï¡¢¤³¤Á¤é¤Î¡ÖÆÈ¼«¤Î¥Ó¥Ø¥¤¥Ó¥¢¤òÄêµÁ¤¹¤ë¡×¤È¤¤¤¦µ»ö¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
¥Ó¥Ø¥¤¥Ó¥¢¤Ë¤Ï¡¢¥µ¡¼¥Ó¥¹ ¥Ó¥Ø¥¤¥Ó¥¢¡¢¥¨¥ó¥É¥Ý¥¤¥ó¥È ¥Ó¥Ø¥¤¥Ó¥¢¡¢¥³¥ó¥È¥é¥¯¥È ¥Ó¥Ø¥¤¥Ó¥¢¡¢¥ª¥Ú¥ì¡¼¥·¥ç¥ó ¥Ó¥Ø¥¤¥Ó¥¢¤Î4¼ïÎब¤¢¤ê¤Þ¤¹¤¬¡¢¤³¤Î¤¦¤Á¡¢¥¨¥ó¥É¥Ý¥¤¥ó¥È ¥Ó¥Ø¥¤¥Ó¥¢°Ê³°¤Î¥Ó¥Ø¥¤¥Ó¥¢¤Ï¡¢¥«¥¹¥¿¥à°À¤È¤·¤ÆÄêµÁ¤¹¤ë¤³¤È¤â¤Ç¤¤Þ¤¹¡£
Î㤨¤Ð¡¢¥µ¡¼¥Ó¥¹ ¥Ó¥Ø¥¤¥Ó¥¢¤Ï IServiceBehavior ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹ (System.ServiceModel.Description) ¤ò¼ÂÁõ¤¹¤ë¥¯¥é¥¹¤È¤·¤ÆÄêµÁ¤·¡¢¹¹¤Ë Attribute ¥¯¥é¥¹ (System) ¤ò·Ñ¾µ¤µ¤»¤Þ¤¹¡£
°Ê²¼¤Ë¡¢¥µ¡¼¥Ó¥¹ ¥Ó¥Ø¥¤¥Ó¥¢¤Î¼ÂÁõÎã¤ò¼¨¤·¤Þ¤¹¡£
using System;
using System.Collections.ObjectModel;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
[AttributeUsage(AttributeTargets.Class)]
public sealed class HelloWorldBehaviorAttribute : Attribute, IServiceBehavior
{
private bool silent;
public bool Silent
{
get
{
return this.silent;
}
set
{
this.silent = value;
}
}
public HelloWorldBehaviorAttribute()
{
this.silent = false;
}
void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
if (this.silent)
{
return;
}
serviceHostBase.Opened +=
delegate
{
Console.WriteLine("Hello World !");
};
}
void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
}
¤³¤Î¥µ¡¼¥Ó¥¹ ¥Ó¥Ø¥¤¥Ó¥¢¤òŬÍѤ¹¤ë¤È¡¢Á°²ó¤ÈƱ¤¸¤¯¡¢¥µ¡¼¥Ó¥¹ ¥Û¥¹¥È¤Î¥ª¡¼¥×¥ó»þ¤Ë¥³¥ó¥½¡¼¥ë¤Ø "Hello World !" ¤È½ÐÎϤ·¤Þ¤¹¡£
°Ê²¼¤Ë¡¢Å¬ÍÑÎã¤ò¼¨¤·¤Þ¤¹¡£
[HelloWorldBehavior(Silent = false)]
public sealed class Service1 : IService1
{
/*...*/
}
³«È¯¤ÈƱ¤¸¤¯¡¢½Ð¤À¤·¤¬°ìÈÖÌÌÅݤǤ¹¤Í¡£
¤¢¤È¡¢XML ¥Ù¡¼¥¹¤Ç¤½¤Î¤Þ¤Þ¸ø³«¤·¤è¤¦¤È»×¤Ã¤Æ¤Þ¤·¤¿¤±¤É¡¢¤Á¤ç¤Ã¤È̵Íý¤½¤¦(´¡¦ω¡¦¡®)
¤À¤Ã¤Æ¡¢FireFox ¤À¤È¡¢¼ÂÂλ²¾È¤¬¤¦¤Þ¤¯°·¤¨¤Ê¤«¤Ã¤¿¤êJavaScript¤¬¤¦¤Þ¤¯Æ°¤«¤Ê¤«¤Ã¤¿¤ê¤¹¤ë¤ó¤À¤â¤ó(´¡¦ω¡¦¡®)
¤·¤ç¤¦¤¬¤Ê¤¤¤«¤é¡¢XSLTÊÑ´¹¤·¤Æ¤«¤é¥µ¡¼¥Ð¡¼¤Ë¥¢¥Ã¥×¥í¡¼¥É¤¹¤ë¤³¤È¤Ë¤·¤Þ¤¹¡£
¤¢¤ì¡¢¤½¤¦¤¹¤ë¤ÈFC2¤Ç¤âÊ̤ˤ¤¤¤¤Î¤«¡¦¡¦¡¦¡£¤ï¤¶¤ï¤¶Â¾¤Î½êõ¤·¤ÆÅÐÏ¿¤Þ¤ÇºÑ¤Þ¤»¤¿¤È¤¤¤¦¤Î¤Ë( Žß§¥ŽÒ )ޏŽÞަަަޝ
¤Þ¤¡¡¢¤½¤ì¤Ï¤¤¤¤¤È¤·¤Æ¡¢¤È¤ê¤¢¤¨¤ºWeb ¥µ¥¤¥È¤Ç¤¤ë¤Þ¤Ç¤Ï¡¢º£¤Þ¤ÇÄ̤ꤳ¤Î¥Ö¥í¥°¤Ç WCF ¤ò°·¤Ã¤Æ¤¤¤³¤¦¤«¤È»×¤¤¤Þ¤¹¡£ ( Web ¥µ¥¤¥È¤Ç¤¤¿¤¢¤È¤â¡¢¤³¤Î¥Ö¥í¥°¤Ç¤â WCF ¤ò°·¤¦¤«¤â¤·¤ì¤Þ¤»¤ó¤¬¡£ )
¤Á¤Ê¤ß¤Ë¡¢¼¡²ó¤Ï WCF ¤Ç¤Î°ì¸µÅª¤Ê¥¨¥é¡¼¥Ï¥ó¥É¥ê¥ó¥°¤ÎÊýË¡¤ò²òÀ⤷¤è¤¦¤«¤È»×¤¤¤Þ¤¹¡£Àè¤Û¤É½ñ¤¤¤¿ ÆÈ¼«¥Ó¥Ø¥¤¥Ó¥¢¤Îµ»ö ¤Ï¡¢¼Â¤Ï¤³¤Î¤¿¤á¤ÎÉÛÀФÀ¤Ã¤¿¤ê¤·¤Þ¤¹ ¡°¡°¡¨
¡Ú ÆÈ¼«¤Î¥Ó¥Ø¥¤¥Ó¥¢ ¥¯¥é¥¹¤òÄêµÁ ¡Û
¥Ó¥Ø¥¤¥Ó¥¢¤Ë¤Ï¡¢¥µ¡¼¥Ó¥¹ ¥Ó¥Ø¥¤¥Ó¥¢¡¢¥¨¥ó¥É¥Ý¥¤¥ó¥È ¥Ó¥Ø¥¤¥Ó¥¢¡¢¥³¥ó¥È¥é¥¯¥È¥Ó¥Ø¥¤¥Ó¥¢¡¢¥ª¥Ú¥ì¡¼¥·¥ç¥ó¥Ó¥Ø¥¤¥Ó¥¢¤Î4¼ïÎब¤¢¤ê¤Þ¤¹¡£
¤³¤ì¤é¤Ï¡¢¤½¤ì¤¾¤ìÍøÍѤǤ¤ëŬÍÑÊýË¡¤¬¡¢°Ê²¼¤Î¤è¤¦¤Ë°Û¤Ê¤ê¤Þ¤¹¡£
- ¥µ¡¼¥Ó¥¹ ¥Ó¥Ø¥¤¥Ó¥¢¡¢¥¨¥ó¥É¥Ý¥¤¥ó¥È ¥Ó¥Ø¥¤¥Ó¥¢¤Ï¡¢¥³¥ó¥Õ¥£¥®¥å¥ì¡¼¥·¥ç¥ó¤ÇŬÍѤ¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
- ¥³¥ó¥È¥é¥¯¥È ¥Ó¥Ø¥¤¥Ó¥¢¡¢¥µ¡¼¥Ó¥¹ ¥Ó¥Ø¥¤¥Ó¥¢¡¢¥ª¥Ú¥ì¡¼¥·¥ç¥ó ¥Ó¥Ø¥¤¥Ó¥¢¤Ï¡¢¥×¥í¥°¥é¥à¤Ç¥«¥¹¥¿¥à°À¤È¤·¤ÆÅ¬ÍѤ¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
- Á´¤Æ¤Î¥Ó¥Ø¥¤¥Ó¥¢¤Ï¡¢¥×¥í¥°¥é¥à¤Ç ServiceHost ¥ª¥Ö¥¸¥§¥¯¥È¤ò¥«¥¹¥¿¥Þ¥¤¥º¤·¤ÆÅ¬ÍѤ¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
[ ¥µ¡¼¥Ó¥¹ ¥Ó¥Ø¥¤¥Ó¥¢ ]
IServiceBehavior ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹ (System.ServiceModel.Description) ¤ò¼ÂÁõ¤·¤¿¥¯¥é¥¹¤Çɽ¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤Ë¤Ï¡¢°Ê²¼¤Î£³¤Ä¤Î¥á¥½¥Ã¥É¤¬ÍѰդµ¤ì¤Æ¤¤¤Þ¤¹¡£
AddBindingParameters ¥á¥½¥Ã¥É
ApplyDispatchBehavior ¥á¥½¥Ã¥É
Validate ¥á¥½¥Ã¥É
[ ¥¨¥ó¥É¥Ý¥¤¥ó¥È ¥Ó¥Ø¥¤¥Ó¥¢ ]
IEndopointBehavior ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹ (System.ServiceModel.Description) ¤ò¼ÂÁõ¤·¤¿¥¯¥é¥¹¤Çɽ¤µ¤ì¤Þ¤¹¡£
¤³¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤Ë¤Ï¡¢°Ê²¼¤Î£´¤Ä¤Î¥á¥½¥Ã¥É¤¬ÍѰդµ¤ì¤Æ¤¤¤Þ¤¹¡£
AddBindingParameters
ApplyClientBehavior
ApplyDispatchBehavior
Validate
[ ¥³¥ó¥È¥é¥¯¥È ¥Ó¥Ø¥¤¥Ó¥¢ ]
IContractBehavior ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹ (System.ServiceModel.Description) ¤ò¼ÂÁõ¤·¤¿¥¯¥é¥¹¤Çɽ¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤Ë¤Ï¡¢°Ê²¼¤Î£´¤Ä¤Î¥á¥½¥Ã¥É¤¬ÍѰդµ¤ì¤Æ¤¤¤Þ¤¹¡£
AddBindingParameters ¥á¥½¥Ã¥É
ApplyClientBehavior ¥á¥½¥Ã¥É
ApplyDispatchBehavior ¥á¥½¥Ã¥É
Validate ¥á¥½¥Ã¥É
[ ¥ª¥Ú¥ì¡¼¥·¥ç¥ó ¥Ó¥Ø¥¤¥Ó¥¢ ]
IOperationBehavior ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹ (System.ServiceModel.Description) ¤ò¼ÂÁõ¤·¤¿¥¯¥é¥¹¤Çɽ¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤Ë¤Ï¡¢°Ê²¼¤Î£´¤Ä¤Î¥á¥½¥Ã¥É¤¬ÍѰդµ¤ì¤Æ¤¤¤Þ¤¹¡£
AddBindingParameters ¥á¥½¥Ã¥É
ApplyClientBehavior ¥á¥½¥Ã¥É
ApplyDispatchBehavior ¥á¥½¥Ã¥É
Validate ¥á¥½¥Ã¥É
³Æ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤Ç¤Ï¶¦Ä̤Î̾Á°¤Î¥á¥½¥Ã¥É¤¬ÍѰդµ¤ì¤Æ¤¤¤Þ¤¹¡£ ( IServiceBehavior ¤Î¤ß¡¢ApplyClientBehavior ¥á¥½¥Ã¥É¤¬Â¸ºß¤·¤Þ¤»¤ó¡£ )
AddBindingParameters ¥á¥½¥Ã¥É
¥Ð¥¤¥ó¥Ç¥£¥ó¥°Í×ÁǤ˥ǡ¼¥¿¤òÄɲ乤뤿¤á¤Î¥á¥½¥Ã¥É¤Ç¤¹¡£
ApplyClientBehavior ¥á¥½¥Ã¥É
¥¯¥é¥¤¥¢¥ó¥È¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¥«¥¹¥¿¥Þ¥¤¥º¤ò¹Ô¤¦¤¿¤á¤Î¥á¥½¥Ã¥É¤Ç¤¹¡£
ApplyDispatchBehavior ¥á¥½¥Ã¥É
¥µ¡¼¥Ó¥¹¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¥«¥¹¥¿¥Þ¥¤¥º¤ò¹Ô¤¦¤¿¤á¤Î¥á¥½¥Ã¥É¤Ç¤¹¡£
Validate ¥á¥½¥Ã¥É
¥Ó¥Ø¥¤¥Ó¥¢¤òŬÍѤ¹¤ë¤¿¤á¤ÎÁ°Äó¾ò·ï¤Î¸¡¾Ú¤ò¹Ô¤¤¤Þ¤¹¡£
[ ¼ÂÁõ¤Ë¤Ä¤¤¤Æ ]
¥Ó¥Ø¥¤¥Ó¥¢ ¥¯¥é¥¹¤òºîÀ®¤¹¤ë¾ì¹ç¡¢Å¬Àڤʥ¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ò¼ÂÁõ¤¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ÅöÁ³¡¢ÆÈ¼«¤Î¥×¥í¥Ñ¥Æ¥£¤òÍѰդ¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£
¥Ó¥Ø¥¤¥Ó¥¢ ¥¯¥é¥¹¤Ï¡¢³«È¯¼Ô¤¬¥³¡¼¥É¤«¤éľÀÜÁàºî¤¹¤ë¤³¤È¤âÁÛÄꤵ¤ì¤ë¤¿¤á¡¢¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ÏÌÀ¼¨Åª¤Ë¼ÂÁõ¤·¤¿Êý¤¬Îɤ¤¤«¤È»×¤¤¤Þ¤¹¡£
[ ¼ÂÁõÎã ]
°Ê²¼¤Ë¡¢¥µ¡¼¥Ó¥¹ ¥Ó¥Ø¥¤¥Ó¥¢ ¥¯¥é¥¹¤Î¼ÂÁõÎã¤ò¼¨¤·¤Þ¤¹¡£
using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Collections.ObjectModel;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Configuration;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
public sealed class HelloWorldBehavior : IServiceBehavior
{
private bool silent;
public bool Silent
{
get
{
return this.silent;
}
set
{
this.silent = value;
}
}
public HelloWorldBehavior()
{
this.silent = false;
}
void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
if (this.silent)
{
return;
}
serviceHostBase.Opened +=
delegate
{
Console.WriteLine("Hello World !");
};
}
void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
}
¤³¤Î¥Ó¥Ø¥¤¥Ó¥¢¤òÀßÄꤹ¤ë¤È¡¢¥µ¡¼¥Ó¥¹ ¥Û¥¹¥È¤¬¥ª¡¼¥×¥ó¤·¤¿»þ¤Ë¥³¥ó¥½¡¼¥ë¤Ø "Hello World !" ¤È¤¤¤¦Ê¸»úÎó¤ò½ÐÎϤ¹¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£Silent ¥×¥í¥Ñ¥Æ¥£¤¬ true ¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¤³¤Îưºî¤òÄɲä·¤Þ¤»¤ó¡£
¡Ú ÆÈ¼«¤Î¥Ó¥Ø¥¤¥Ó¥¢¤ò¥×¥í¥°¥é¥à¤«¤é ServiceHost ¤ËŬÍѤ¹¤ë ¡Û
¥×¥í¥°¥é¥à¤«¤é ServiceHost ¤ËŬÍѤ¹¤ë¾ì¹ç¡¢ÆÃÊ̤ʽèÍý¤ÏÉÔÍפǡ¢Ä̾ï¤Î¥Ó¥Ø¥¤¥Ó¥¢ÀßÄêÊýË¡¤ÈÊѤï¤ê¤Þ¤»¤ó¡£¥³¡¼¥É¤Ç¥Ó¥Ø¥¤¥Ó¥¢¤òÀßÄꤹ¤ëÊýË¡¤Ë¤Ä¤¤¤Æ¤Ï°Ê²¼¤Îµ»ö¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
C#¤È½ô¡¹ - WCF¤Î¥Û¥¹¥Æ¥£¥ó¥°
¡Ú ÆÈ¼«¤Î¥Ó¥Ø¥¤¥Ó¥¢¤ò¥³¥ó¥Õ¥£¥®¥å¥ì¡¼¥·¥ç¥ó¤ÇŬÍѤ¹¤ë ¡Û
¥µ¡¼¥Ó¥¹ ¥Ó¥Ø¥¤¥Ó¥¢¡¢¥¨¥ó¥É¥Ý¥¤¥ó¥È ¥Ó¥Ø¥¤¥Ó¥¢¤Ï¡¢¥³¥ó¥Õ¥£¥®¥å¥ì¡¼¥·¥ç¥ó¤«¤éŬÍѤ¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£¤·¤«¤·¡¢¥Ó¥Ø¥¤¥Ó¥¢ ¥¯¥é¥¹¤òÄêµÁ¤·¤¿¤À¤±¤Ç¤Ï¡¢¥³¡¼¥É¤«¤é¤Ï°·¤¨¤Æ¤â¥³¥ó¥Õ¥£¥®¥å¥ì¡¼¥·¥ç¥ó¤Ç°·¤¦¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¡£¥³¥ó¥Õ¥£¥®¥å¥ì¡¼¥·¥ç¥ó¤Ç°·¤¦¤¿¤á¤Ë¤Ï¡¢³ÈÄ¥¥¨¥ì¥á¥ó¥È¤òÄêµÁ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
[ ³ÈÄ¥¥¨¥ì¥á¥ó¥È ¥¯¥é¥¹ ]
³ÈÄ¥¥¨¥ì¥á¥ó¥È¤òÄêµÁ¤¹¤ë¤Ë¤Ï¡¢ BehaviorExtensionElement ¥¯¥é¥¹ (System.ServiceModel.Configuration) ¤Î·Ñ¾µ¥¯¥é¥¹¤òÄêµÁ¤·¤Þ¤¹¡£
BehaviorExtensionElement ¥¯¥é¥¹¤Ë¤Ï¡¢°Ê²¼¤Î2¤Ä¤ÎÃê¾Ý¥á¥ó¥Ð¤¬ÍѰդµ¤ì¤Æ¤¤¤Þ¤¹¡£
BehaviorType ¥×¥í¥Ñ¥Æ¥£
¥Ó¥Ø¥¤¥Ó¥¢ ¥¯¥é¥¹¤Î·¿¾ðÊó¤òÊÖ¤¹¤è¤¦¤Ë¼ÂÁõ¤·¤Þ¤¹¡£
CreateBehavior ¥á¥½¥Ã¥É
¥Ó¥Ø¥¤¥Ó¥¢ ¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®¤·¤ÆÊÖ¤¹¤è¤¦¤Ë¼ÂÁõ¤·¤Þ¤¹¡£
¤³¤ÎºÝ¡¢³ÈÄ¥¥¨¥ì¥á¥ó¥È¤Î°À ( ¸å½Ò ) ¤ÇÀßÄꤵ¤ì¤¿Ãͤò¡¢¥Ó¥Ø¥¤¥Ó¥¢ ¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ËÈ¿±Ç¤µ¤»¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
[ ³ÈÄ¥¥¨¥ì¥á¥ó¥È¤Î°À ]
¥Ó¥Ø¥¤¥Ó¥¢ ¥¯¥é¥¹¤Ë¥×¥í¥Ñ¥Æ¥£¤òÄêµÁ¤·¤¿¾ì¹ç¡¢³ÈÄ¥¥¨¥ì¥á¥ó¥È¤Ç¤â¤½¤ì¤òÀßÄê¤Ç¤¤ë¤è¤¦¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤Î¤¿¤á¤Ë¤Ï¡¢³ÈÄ¥¥¨¥ì¥á¥ó¥È ¥¯¥é¥¹¤Ë¥×¥í¥Ñ¥Æ¥£¤òÍѰդ·¤Æ¡¢ConfigurationPropertyAttribute ¥¯¥é¥¹ (System.Configuration) ¤ò¥×¥í¥Ñ¥Æ¥£¤Î°À¤È¤·¤ÆÉղ乤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
[ ¼ÂÁõÎã ]
Àè¤Û¤É¤ÎÎã¤ÇÄêµÁ¤·¤¿ HelloWorldBehavior ¥Ó¥Ø¥¤¥Ó¥¢¤ò¡¢¥³¥ó¥Õ¥£¥®¥å¥ì¡¼¥·¥ç¥ó¤Ç°·¤¦¤¿¤á¤Î³ÈÄ¥¥¨¥ì¥á¥ó¥È ¥¯¥é¥¹¤ÎÎã¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£
using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Collections.ObjectModel;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Configuration;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
public sealed class HelloWorldElement : BehaviorExtensionElement
{
public override Type BehaviorType
{
get
{
return typeof(HelloWorldBehavior);
}
}
protected override object CreateBehavior()
{
HelloWorldBehavior result = new HelloWorldBehavior();
result.Silent = this.Silent;
return result;
}
[ConfigurationProperty("silent", DefaultValue = false)]
public bool Silent
{
get
{
return (bool)base["silent"];
}
set
{
base["silent"] = value;
}
}
private ConfigurationPropertyCollection properties;
protected override ConfigurationPropertyCollection Properties
{
get
{
if (this.properties == null)
{
ConfigurationPropertyCollection propertys = new ConfigurationPropertyCollection();
propertys.Add(new ConfigurationProperty("silent", typeof(bool), false, null, null, ConfigurationPropertyOptions.None));
this.properties = propertys;
}
return this.properties;
}
}
}
[ ¥³¥ó¥Õ¥£¥®¥å¥ì¡¼¥·¥ç¥ó¤ÇŬÍÑ ]
ÆÈ¼«¤Î¥Ó¥Ø¥¤¥Ó¥¢¤ò¥³¥ó¥Õ¥£¥®¥å¥ì¡¼¥·¥ç¥ó¤ÇŬÍѤ¹¤ë¾ì¹ç¡¢ [ system.serviceModel ] - [ extensions ] ¥»¥¯¥·¥ç¥ó¤Ë¡¢³ÈÄ¥¥¨¥ì¥á¥ó¥È¤òÄɲ䷤ơ¢¥³¥ó¥Õ¥£¥®¥å¥ì¡¼¥·¥ç¥ó¤Ç°·¤¦ºÝ¤Î̾¾Î¤òÀßÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
Àè¤Û¤ÉÄêµÁ¤·¤¿³ÈÄ¥¥¨¥ì¥á¥ó¥È¤ò extensions ¥»¥¯¥·¥ç¥ó¤ËÄɲ乤ëÎã¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£ ( ¥¢¥»¥ó¥Ö¥ê̾¤È³ÈÄ¥¥¨¥ì¥á¥ó¥È¤Î̾Á°¶õ´Ö¤Ï¡¢¶¦¤Ë "WCFCustomize" ¤È¤·¤Þ¤·¤¿¡£ )
<extensions>
<behaviorExtensions>
<add name="helloWorld" type="WCFCustomize.HelloWorldElement, WCFCustomize, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
extensions ¥»¥¯¥·¥ç¥ó¤Ë³ÈÄ¥¥¨¥ì¥á¥ó¥È¤òÄɲ乤ë¤È¡¢¤½¤ÎºÝ¤Ë name °À¤Ë»ØÄꤷ¤¿Ì¾¾Î¤ò¥»¥¯¥·¥ç¥ó̾¤È¤·¤Æ¡¢bihavior ¥»¥¯¥·¥ç¥óÆâ¤Ë¤ÆÀßÄꤹ¤ë¤³¤È¤¬²Äǽ¤È¤Ê¤ê¤Þ¤¹¡£
°Ê²¼¤Ë¡¢»ÈÍÑÎã¤ò¼¨¤·¤Þ¤¹¡£
<behaviors>
<serviceBehaviors>
<behavior name="SampleBehavior">
<helloWorld silent="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
¤³¤ì¤Ç¡¢ÆÈ¼«¤Î¥Ó¥Ø¥¤¥Ó¥¢¤¬¥µ¡¼¥Ó¥¹¤ËŬÍѤµ¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£¥µ¡¼¥Ó¥¹ ¥Û¥¹¥È¤¬¥ª¡¼¥×¥ó¤·¤¿»þ¤Ë "Hello World !" ¤È½ÐÎϤµ¤ì¤ë¤Ï¤º¤Ç¤¹¡£ ( ¥³¥ó¥½¡¼¥ë¤Ë½ÐÎϤµ¤ì¤ë¤Î¤Ç¡¢¥³¥ó¥½¡¼¥ë¥¢¥×¥ê¤Ç¥»¥ë¥Õ ¥Û¥¹¥Æ¥£¥ó¥°¤·¤Æ¤¯¤À¤µ¤¤¡£ )
¡Ú ÆÈ¼«¤Î¥Ó¥Ø¥¤¥Ó¥¢¤ò°À¤È¤·¤ÆÅ¬ÍÑ ¡Û
°Ê²¼¤Îµ»ö¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
C#¤È½ô¡¹ - ÆÈ¼«¤Î¥Ó¥Ø¥¤¥Ó¥¢¤òÄêµÁ¤¹¤ë £²
¤³¤Î¥¢¥«¥¦¥ó¥È¤Ï¥Õ¥¡¥¤¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤Î¥¢¥¯¥»¥¹¸¢¤Ê¤É¤¬À©¸Â¤µ¤ì¤Æ¤¤¤Æ¡¢¥í¥°¥Õ¥¡¥¤¥ë¤ò½ÐÎϤ¹¤ë¤³¤È¤¹¤é¤Ç¤¤Þ¤»¤ó¡£
¤³¤ì¤ò²ò·è¤¹¤ë¤Ë¤Ï¡¢ÂоݤΥե¡¥¤¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ØÅ¬Àڤʸ¢¸Â¤òÉղ乤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
¥¤¥ó¥¹¥È¡¼¥é¤Ç¡¢¤³¤Î¸¢¸ÂÉղäνèÍý¤ò¹Ô¤¤¤¿¤¤¾ì¹ç¡¢¥¤¥ó¥¹¥È¡¼¥é¤Î¥«¥¹¥¿¥àưºî¤Ç¤³¤ì¤ò¹Ô¤¤¤Þ¤¹¡£
°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
//using System;
//using System.Configuration.Install;
//using System.IO;
//using System.Security.AccessControl;
[RunInstaller(true)]
public partial class CustomInstaller : Installer
{
public CustomInstaller()
{
InitializeComponent();
}
public override void Install(System.Collections.IDictionary stateSaver)
{
string assemblyPathName = this.Context.Parameters["assemblypath"];
int fileDivisionIndex = assemblyPathName.LastIndexOf('\\');
string installDirectoryPathName = assemblyPathName.Remove(fileDivisionIndex);
DirectoryInfo installDirectoryInfo = new DirectoryInfo(installDirectoryPathName);
// ¥¤¥ó¥¹¥È¡¼¥ëÀè¥Ç¥£¥ì¥¯¥È¥ê¤Î ACL ( ¥¢¥¯¥»¥¹À©¸æ¥ê¥¹¥È ) ¤ò¼èÆÀ
DirectorySecurity installDirectoryACL = installDirectoryInfo.GetAccessControl();
// Network Service ¥¢¥«¥¦¥ó¥È¤Î½ñ¤¹þ¤ß¸¢¸Â¤òɽ¤¹¥ª¥Ö¥¸¥§¥¯¥È¤òÀ¸À®
FileSystemAccessRule writingAuthorityOfWorkerProcess = new FileSystemAccessRule("NT AUTHORITY\\NETWORK SERVICE", FileSystemRights.Write, AccessControlType.Allow);
// ACL ¤Ë¡¢Network Service ¥¢¥«¥¦¥ó¥È¤Î½ñ¤¹þ¤ß¸¢¸Â¤òÄɲ乤ë
installDirectoryACL.AddAccessRule(writingAuthorityOfWorkerProcess);
// ¥¤¥ó¥¹¥È¡¼¥ëÀè¥Ç¥£¥ì¥¯¥È¥ê¤Î ACL ¤òÀßÄê
installDirectoryInfo.SetAccessControl(installDirectoryACL);
base.Install(stateSaver);
}
}
¤³¤ÎÎã¤Ç¤Ï¡¢¥¤¥ó¥¹¥È¡¼¥ëÀè¥Ç¥£¥ì¥¯¥È¥ê¤ËÂФ·¤Æ¡¢Network Service¥¢¥«¥¦¥ó¥È¤¬½ñ¤¹þ¤ß¤ò¹Ô¤¦¤¿¤á¤Î¸¢¸Â¤òÉղ䷤Ƥ¤¤Þ¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢Web ¥¢¥×¥ê¤¬¥¤¥ó¥¹¥È¡¼¥ëÀè¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¥í¥°¥Õ¥¡¥¤¥ë¤ò½ÐÎϤ¹¤ë¤³¤È¤¬²Äǽ¤È¤Ê¤ê¤Þ¤¹¡£
¥¤¥ó¥¹¥È¡¼¥é¡¢¥«¥¹¥¿¥àưºî¼«ÂΤÎÀâÌÀ¤Ï¤³¤³¤Ç¤Ï¾Êά¤·¤Þ¤¹¡£¤³¤ì¤Ë¤Ä¤¤¤Æ¤Ï°Ê²¼¤Î¥Á¥å¡¼¥È¥ê¥¢¥ë¤ò»²¹Í¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£
Windows ¥¤¥ó¥¹¥È¡¼¥é¤Ç¤ÎÇÛÃ֤˴ؤ¹¤ë¥Á¥å¡¼¥È¥ê¥¢¥ë
¤½¤ó¤Ç¡¢¤½¤Ã¤Á¤Ç WCF ´ØÏ¢¤Î¾ðÊó¤ò°·¤Ã¤Æ¤¤¤¯¤Ä¤â¤ê¤Ç¤¹¡£
Web ¥µ¥¤¥È¤Ï XML ¥Ù¡¼¥¹¤Ç¹½ÃÛ¤·¤è¤¦¤È¹Í¤¨¤Æ¤¤¤Þ¤¹¡£
¤Ç¡¢¤½¤¦¤Ê¤ë¤È FC2 ¤µ¤ó¤Î̵ÎÁ¥Û¡¼¥à¥Ú¡¼¥¸¥¹¥Ú¡¼¥¹¤Ç¤Ï̵Íý¤Ê¤ó¤Ç¤¹¤è¤Í¡¦¡¦¡¦¡£
XML ¥Õ¥¡¥¤¥ë¼«ÂΤÏÇÛÃÖ¤¹¤ë¤³¤È¤¬µö²Ä¤µ¤ì¤Æ¤Þ¤¹¤¬¡¢´Î¿´¤Î XSLT ¥Õ¥¡¥¤¥ë¤¬µö²Ä¤µ¤ì¤Æ¤¤¤Ê¤¤¤ß¤¿¤¤¤Ê¤ó¤Ç¤¹ orz
Yahoo! ¥¸¥ª¥·¥Æ¥£¡¼¥º ¤Ê¤é XML ¤â XSLT ¤âµö²Ä¤µ¤ì¤Æ¤¤¤ë¤ó¤À¤±¤É¡¢¹¹ð¤¬¥Ç¥«¥Ç¥«¤È¤·¤Æ¤Æ¤Á¤ç¤Ã¤È¡¦¡¦¡¦¡£
¤É¤Ã¤«¤¤¤¤¥È¥³¤Ê¤¤¤«¤Ê¤¡¡£
¤È¤³¤í¤Ç¡¢ËͤϺ£¤Þ¤Ç XML ¥Ù¡¼¥¹¤Î Web ¥µ¥¤¥È¤ò¥¤¥ó¥¿¡¼¥Í¥Ã¥È¾å¤Ç¸«¤«¤±¤¿¤³¤È¤¬¤Ê¤¤µ¤¤¬¤¹¤ë¤ó¤Ç¤¹¤±¤É¡¢¤Ê¤ó¤Ç¤Ç¤·¤ç¤¦¤«¡©
¥Ç¥¶¥¤¥ó¤ò´°Á´¤ËÅý°ì¤Ç¤¤ë¤·¡¢Êѹ¹¤Ë¶¯¤¤¤·¡¢¥Ç¥¶¥¤¥ó¤È¹½Â¤¤ÎʬΥ¤â´°Á´¤À¤·¡¢¤½¤ì¤Û¤ÉÆñ¤·¤¯¤â¤Ê¤µ¤½¤¦¤Ê¤ó¤À¤«¤é¡¢¤½¤ì¤Ê¤ê¤ËÉáµÚ¤·¤Æ¤¤¤Æ¤â¤¤¤¤µ¤¤¬¤¹¤ë¤ó¤Ç¤¹¤±¤É ¡°¡°¡¨
º£¤Þ¤Ç¼ÂºÝ¤Ë XML ¥Ù¡¼¥¹¤Î Web ¥µ¥¤¥È¤òºî¤Ã¤¿¤³¤È¤¬¤Ê¤¤¤ó¤Ç¤¹¤±¤É¡¢¤â¤·¤«¤·¤Æ²¿¤«Íî¤È¤··ê¤¬¤¢¤ë¡©
¥Ó¥ë¥ÉÁ°¤Ë¼Â¹Ô¤¹¤ë¥³¥Þ¥ó¥É ¥é¥¤¥ó
"%programfiles%\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /u "$(TargetName)"
¥Ó¥ë¥É¸å¤Ë¼Â¹Ô¤¹¤ë¥³¥Þ¥ó¥É ¥é¥¤¥ó
"%programfiles%\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /i "$(TargetFileName)"
¤³¤ì¤Ç¡¢¥Ó¥ë¥É¤ÈƱ»þ¤Ë¥¢¥»¥ó¥Ö¥ê¤¬ GAC ¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Þ¤¹¡£
¤Ç¡¢¤Ê¤ó¤«Ëͤâ PowerShell ¤È²¿¤«¤òÏ¢·È¤µ¤»¤¿¤¤¤Ê¤È¤¦¤º¤¦¤º¤·¤Æ¤¤¿¤Î¤Ç¡¢ºÇ¶á¥Þ¥¤¥Ö¡¼¥à¤Î WCF ¤ò PowerShell ¤Ç°·¤Ã¤Æ¤ß¤è¤¦¤«¤È»×¤¤¤Þ¤¹¡£
¹½À®¤Ï¤³¤ó¤Ê´¶¤¸
- WCF ¥µ¡¼¥Ó¥¹¤Ï C# ¤ÇºîÀ® ( ¤É¤¦¤»¤À¤«¤é Visual Studio ¤Ï»È¤ï¤º )
- WCF ¤Î¥Û¥¹¥È¤Ï PowerShell
- WCF ¤Î¥¯¥é¥¤¥¢¥ó¥È¤â PowerShell
[ 0. ½àÈ÷ ]
¤³¤Îµ»ö¤Ç¤Ï¡¢´ðËÜŪ¤Ë PowerShell ¤ò»È¤Ã¤Æ¤Û¤È¤ó¤É¤ÎÁàºî¤ò¿Ê¤á¤Æ¤¤¤¤Þ¤¹¡£
0-1. ɬÍפʤâ¤Î
°Ê²¼¤Î3¤Ä¤¬¤¢¤ì¤ÐÂç¾æÉפʤϤº¤Ç¤¹¡£
- Windows PowerShell 1.0 ( ŬÀڤʤΤòÁª¤ó¤Ç¤¯¤À¤µ¤¤¡£ )
- .NET Framework 3.0 ( .NET 3.0 ¤Ï .NET 2.0 + α ¤Ç¤¹¡£ )
- .NET Framework 2.0 SDK ( .NET 3.0 Æþ¤ì¤Æ¤«¤é¤Í¡£ )
0-2. OS ¤¬ Windows Vista¤Î¾ì¹ç¤ÎÃí°ÕÅÀ
¤â¤·¡¢OS ¤¬ Windows Vista¤Ç¤¢¤ë¾ì¹ç¡¢´ÉÍý¼Ô¸¢¸Â¤òÍ׵ᤵ¤ì¤ë¾ìÌ̤¬¤¢¤ê¤Þ¤¹¡£¤Ê¤Î¤Ç¡¢ OS ¤¬ Windows Vista ¤Î¾ì¹ç¤Ï¡¢PowerShell ¤ò´ÉÍý¼Ô¥â¡¼¥É¤Ç¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤¡£
´ÉÍý¼Ô¥â¡¼¥É¤Ç¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢PowerShell ¤Î¥·¥ç¡¼¥È¥«¥Ã¥È¤ò±¦¥¯¥ê¥Ã¥¯¤·¤Æ [ ´ÉÍý¼Ô¤È¤·¤Æ¼Â¹Ô ] ¤òÁªÂò¤·¤Þ¤¹¡£
0-3. ºî¶È¥Õ¥©¥ë¥À
C ¥É¥é¥¤¥Öľ²¼¤Ë work ¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥©¥ë¥À¤òºîÀ®¤·¡¢¤½¤³¤Çºî¶È¤ò¹Ô¤¦¤³¤È¤Ë¤·¤Þ¤¹¡£
°Ê²¼¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤¡£
(New-Item "C:\work1" -itemType "directory") | Set-Location -path {$_.FullName}
¤³¤ì¤Ç¡¢ work ¥Õ¥©¥ë¥À¤¬ºîÀ®¤µ¤ì¡¢PowerShell ¤Î¥«¥ì¥ó¥È¥Ñ¥¹¤¬ "C:\work" ¤Ë°Üư¤·¤Þ¤¹¡£
[ 1. WCF ¥µ¡¼¥Ó¥¹ºîÀ® ]
1-0. ³µÍ×
¤Þ¤º¤Ï WCF ¥µ¡¼¥Ó¥¹ ¤ò¥¯¥é¥¹ ¥é¥¤¥Ö¥é¥ê¤È¤·¤ÆºîÀ®¤·¤Þ¤¹¡£
Visual Studio ¤Ï»È¤ï¤º¡¢¥á¥âÄ¢¤Ç¥³¡¼¥É¥Õ¥¡¥¤¥ë¤ò½ñ¤¤¤Æ¡¢¥³¥ó¥Ñ¥¤¥ë¤Ë¤ÏC# ¥³¥ó¥Ñ¥¤¥é¤òPowerShell ¾å¤«¤é°·¤¤¤Þ¤¹¡£
1-1. WCF ¥µ¡¼¥Ó¥¹¤Î³µÍ×
¥¢¥¯¥»¥¹¿ô¤ò¥«¥¦¥ó¥È¤¹¤ë´Êñ¤Ê¥µ¡¼¥Ó¥¹¤Ç¤¹¡£
Access ¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹¤¿¤Ó¤Ë¥«¥¦¥ó¥È¤µ¤ì¤Þ¤¹¡£
GetCount ¥á¥½¥Ã¥É¤Ç¥¢¥¯¥»¥¹¿ô¤ò¼èÆÀ¤Ç¤¤Þ¤¹¡£
Release ¥á¥½¥Ã¥É¤Ç¥µ¡¼¥Ó¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤¬²òÊü¤µ¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¥«¥¦¥ó¥È¤¬¥ê¥»¥Ã¥È¤µ¤ì¤Þ¤¹¡£ ( ¤³¤ÎÄøÅ٤Υµ¡¼¥Ó¥¹¤Ê¤é¡¢¥¤¥ó¥¹¥¿¥ó¥¹¤Ï¤½¤Î¤Þ¤Þ¤Ç¡¢¥«¥¦¥ó¥È¤ò 0 ¤ËÀßÄꤹ¤ì¤ÐºÑ¤ß¤Þ¤¹¤¬¡°¡°¡¨ )
¥µ¡¼¥Ó¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ï¥¯¥é¥¤¥¢¥ó¥ÈËè¤ËÍѰդµ¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¥¢¥¯¥»¥¹¿ô¤Ï³Æ¥¯¥é¥¤¥¢¥ó¥ÈËè¤Ë¥«¥¦¥ó¥È¤µ¤ì¤Þ¤¹¡£
¥¢¥»¥ó¥Ö¥ê̾
Sample.WCFServices.dll
ÄêµÁ¤¹¤ë·¿
Sample.WCFServices.ICounterService ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹
Sample.WCFServices.CounterService ¥¯¥é¥¹
1-2. ICounterService ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ÎºîÀ®
¤Þ¤º¡¢ ICounterService.cs ¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤ò¥á¥âÄ¢¤Ç³«¤¤Þ¤¹¡£
°Ê²¼¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤¡£
$icounterServiceCodeFile = New-Item "ICounterService.cs" -itemType "file";
notepad $icounterServiceCodeFile.FullName;
¤³¤ì¤Ç¡¢ºî¶È¥Õ¥©¥ë¥À¤Ë ICounterService.cs ¥Õ¥¡¥¤¥ë¤¬ºîÀ®¤µ¤ì¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤¬¥á¥âÄ¢¤Ç³«¤«¤ì¤Þ¤¹¡£
¼¡¤Ë¡¢¥á¥âÄ¢¤Ç°Ê²¼¤Î¥³¡¼¥É¤òޤêÉÕ¤±¤Þ¤¹¡£
using System;
using System.ServiceModel;
namespace Sample.WCFServices
{
[ServiceContract(Namespace = "http://schemas.sample.net/WCFServices", SessionMode = SessionMode.Allowed)]
public interface ICounterService
{
[OperationContract]
void Access();
[OperationContract]
void Release();
[OperationContract]
int GetCount();
}
}
ޤêÉÕ¤±¤Þ¤·¤¿¤é¡¢Êݸ¤ò¹Ô¤¤¡¢¥á¥âÄ¢¤òÊĤ¸¤Þ¤¹¡£
1-3. CounterService ¥¯¥é¥¹¤ÎºîÀ®
CounterService.cs ¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤ò¥á¥âÄ¢¤Ç³«¤¤Þ¤¹¡£
°Ê²¼¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤¡£
$counterServiceCodeFile = New-Item "CounterService.cs" -itemType "file";
notepad $counterServiceCodeFile.FullName;
¤³¤ì¤Ç¡¢ºî¶È¥Õ¥©¥ë¥À¤Ë CounterService.cs ¥Õ¥¡¥¤¥ë¤¬ºîÀ®¤µ¤ì¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤¬¥á¥âÄ¢¤Ç³«¤«¤ì¤Þ¤¹¡£
¼¡¤Ë¡¢¥á¥âÄ¢¤Ç°Ê²¼¤Î¥³¡¼¥É¤òޤêÉÕ¤±¤Þ¤¹¡£
using System;
using System.ServiceModel;
namespace Sample.WCFServices
{
[ServiceBehavior(Namespace = "http://schemas.sample.net/WCFServices", InstanceContextMode = InstanceContextMode.PerSession)]
public class CounterService : ICounterService
{
private int count;
public void Access()
{
try
{
checked
{
this.count++;
}
}
catch (OverflowException)
{
FaultReasonText overflowReasonText = new FaultReasonText("¤â¤¦¿ô¤¨¤é¤ì¤Ê¤¤¡£¡£¡£");
FaultReason overflowReason = new FaultReason(overflowReasonText);
FaultCode overflowCode = FaultCode.CreateReceiverFaultCode("overflow", "http://schemas.sample.net/WCFServices/Fault");
throw new FaultException(overflowReason, overflowCode);
}
}
[OperationBehavior(ReleaseInstanceMode = ReleaseInstanceMode.AfterCall)]
public void Release()
{
}
public int GetCount()
{
return this.count;
}
}
}
ޤêÉÕ¤±¤Þ¤·¤¿¤é¡¢Êݸ¤ò¹Ô¤¤¡¢¥á¥âÄ¢¤òÊĤ¸¤Þ¤¹¡£
1-4. ¥¢¥»¥ó¥Ö¥ê¤Ë½ð̾¤òÉÕ¤±¤ë¤¿¤á¤Ë¥¡¼ ¥Ú¥¢¤òÀ¸À®
¤¨¤Ã¤È¡¢¥¢¥»¥ó¥Ö¥ê¤Ë½ð̾¤òÉÕ¤±¤Þ¤¹¡£¤Ê¤ó¤ÇÉÕ¤±¤ë¤Î¤«¤È¤¤¤¦¤È¡¢º£²ó¡¢¥¯¥é¥¤¥¢¥ó¥È¤â PowerShell ¤ÇºîÀ®¤·¤Þ¤¹¡£¤½¤ÎºÝ¡¢¥¸¥§¥Í¥ê¥Ã¥¯ ¥¯¥é¥¹¤òÍøÍѤ·¡¢¥¸¥§¥Í¥ê¥Ã¥¯ °ú¿ô¤Ë ICounterService ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¡¦¡¦¡¦¤Ç¡¢¤É¤¦¤â PowerShell ¤Ç¥¸¥§¥Í¥ê¥Ã¥¯°ú¿ô¤Ë»ØÄꤹ¤ë·¿¤Î¥¢¥»¥ó¥Ö¥ê¤Ï¡¢GAC ¤ËÅÐÏ¿¤µ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ë¤ß¤¿¤¤¤Ç¤¹¡£¤Ê¤Î¤Ç¡¢Sample.WCFServices.dll ¤Ë½ð̾¤òÉÕ¤±¤Æ GAC ¤ËÅÐÏ¿¤·¤Þ¤¹¡£
¤Þ¤¡¡¢Ê£¿ô¤Î¥¢¥×¥ê¤Ç»²¾È¤µ¤ì¤ë¥¢¥»¥ó¥Ö¥ê¤Ï GAC ¤ËÅÐÏ¿¤¹¤ë¤Ù¤¤Ç¤¹¤·¤Í¡£( WSDL ¤ò¸ø³«¤·¤Æ¡¢Svcutil.exe ¤Ç¥×¥í¥¥· ¥¯¥é¥¹¤òÀ¸À®¤¹¤ë¾ì¹ç¤ÏÉÔÍפǤ¹¡£¤Ç¤â¡¢º£²ó¤Ï¤½¤¦¤·¤Þ¤»¤ó¡°¡°¡¨ )
°Ê²¼¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤¡£
&"$env:programfiles\Microsoft Visual Studio 8\SDK\v2.0\Bin\sn.exe" -k Sample.WCFServices.snk
¤³¤Î¥³¥Þ¥ó¥É¤Ë¤è¤ê¡¢ºî¶È¥Õ¥©¥ë¥À¤Ë Sample.WCFServices.snk ¤È¤¤¤¦Ì¾Á°¤Î¥¡¼ ¥Ú¥¢ ¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£
1-5. ¥³¥ó¥Ñ¥¤¥ë
1-2 ¤È 1-3 ¤ÇºîÀ®¤·¤¿£²¤Ä¤Î¥³¡¼¥É¥Õ¥¡¥¤¥ë¤ò¡¢¥¯¥é¥¹ ¥é¥¤¥Ö¥é¥ê·Á¼°¤Ë¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£
°Ê²¼¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤¡£
&"$env:windir/Microsoft.NET/Framework/v2.0.50727/csc.exe" /out:"Sample.WCFServices.dll" /target:library /lib:"$env:windir\Microsoft.NET\Framework\v3.0\Windows Communication Foundation" /reference:"System.ServiceModel.dll" /optimize+ /keyfile:"Sample.WCFServices.snk" *.cs;
¤³¤Î¥³¥Þ¥ó¥É¤Ë¤è¤ê¡¢£²¤Ä¤Î¥³¡¼¥É¥Õ¥¡¥¤¥ë¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¡¢ºî¶È¥Õ¥©¥ë¥À¤Ë Sample.WCFServices.dll ¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤Þ¤¿¡¢Àè¤Û¤ÉÀ¸À®¤·¤¿¥¡¼ ¥Ú¥¢¤Ë¤è¤ê¡¢¥¢¥»¥ó¥Ö¥ê¤Ë½ð̾¤¬»Ü¤µ¤ì¤Þ¤¹¡£
1-6. GAC ¤ËÅÐÏ¿
1-4 ¤Ç²òÀ⤷¤¿¤è¤¦¤Ë¡¢º£²ó¤Ï WCF ¥µ¡¼¥Ó¥¹¤Î¥¢¥»¥ó¥Ö¥ê¤ò GAC ¤Ø¤ÈÅÐÏ¿¤·¤Þ¤¹¡£
°Ê²¼¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤¡£
&"$env:programfiles\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /i "Sample.WCFServices.dll"
¤³¤Î¥³¥Þ¥ó¥É¤Ë¤è¤ê¡¢ Sample.WCFService.dll ¤¬ GAC ¤Ø¤ÈÅÐÏ¿¤µ¤ì¤Þ¤¹¡£
¤Ê¤ª¡¢¸å¤Ç Sample.WCFService.dll ¤ò GAC ¤«¤éºï½ü¤¹¤ëºÝ¤Ë¤Ï¡¢°Ê²¼¤Î¥³¥Þ¥ó¥É¤Çºï½ü²Äǽ¤Ç¤¹¡£ ( º£¤Ï¤Þ¤Àºï½ü¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¤Í¡£ )
&"$env:programfiles\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /u "Sample.WCFServices"
[ 2. PowerShell ¤Ç WCF ¤ò¥Û¥¹¥Æ¥£¥ó¥° ]
ExecuteCounterServiceHosting ¤È¤¤¤¦´Ø¿ô¤òÄêµÁ¤·¡¢¤½¤ÎÃæ¤Ç¥Û¥¹¥Æ¥£¥ó¥°¤Î°ìÏ¢¤Î½èÍý¤ò¹Ô¤¤¤Þ¤¹¡£¤³¤³¤Ç¤Ï¡¢NetTcpBinding ¤ò»È¤¦¤³¤È¤Ë¤·¤Þ¤¹¡£
°Ê²¼¤Î¥³¡¼¥É¤òÁ´¤Æ¥³¥Ô¡¼¤·¡¢PowerShell ¤ËޤêÉÕ¤±¤Æ¤¯¤À¤µ¤¤¡£
function ExecuteCounterServiceHosting
{
# WCFɬ¿Ü¤Î¥¯¥é¥¹ ¥é¥¤¥Ö¥é¥ê¤ò GAC ¤«¤é¥í¡¼¥É
[void][System.Reflection.Assembly]::LoadWithPartialName("System.ServiceModel");
# ¼«ºî¤Î WCF ¥µ¡¼¥Ó¥¹ ¥¯¥é¥¹ ¥é¥¤¥Ö¥é¥ê¤ò GAC ¤«¤é¥í¡¼¥É
[void][System.Reflection.Assembly]::LoadWithPartialName("Sample.WCFServices");
# ¥µ¡¼¥Ó¥¹ ¥¯¥é¥¹¤Î·¿¾ðÊó
$counterServiceType = [Sample.WCFServices.CounterService];
# ¥Ù¡¼¥¹ ¥¢¥É¥ì¥¹
$counterServiceAddress = New-Object "System.Uri" @("net.tcp://localhost:10000/Sample/WCFServices/CounterService.svc");
# ¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ÎÀßÄê
$counterServiceBinding = New-Object "System.ServiceModel.NetTcpBinding" @([System.ServiceModel.SecurityMode]::None);
$counterServiceBinding.Namespace = "http://schemas.sample.net/WCFServices";
# ¥³¥ó¥È¥é¥¯¥È¤Î¼èÆÀ
$counterServiceContractType = [Sample.WCFServices.ICounterService];
# ¥µ¡¼¥Ó¥¹ ¥Û¥¹¥ÈºîÀ®
$counterServiceHost = New-Object "System.ServiceModel.ServiceHost" @($counterServiceType, $counterServiceAddress);
[void]$counterServiceHost.AddServiceEndpoint($counterServiceContractType, $counterServiceBinding, [System.String]::Empty);
# ¥Û¥¹¥Æ¥£¥ó¥° ³«»Ï
$counterServiceHost.Open();
# ÂÔµ¡
[System.Console]::WriteLine("WCF ¥µ¡¼¥Ó¥¹ ¤Î ¥Û¥¹¥Æ¥£¥ó¥°¤ò³«»Ï¤·¤Þ¤·¤¿¡£");
foreach($dispatcher in $counterServiceHost.ChannelDispatchers)
{
[System.Console]::WriteLine("Listening uri: {0}", $dispatcher.Listener.Uri.ToString());
}
[System.Console]::WriteLine("Enter ¥¡¼¤ò²¡¤¹¤È½ªÎ»¤·¤Þ¤¹¡£");
[System.Console]::ReadLine();
# ¥Û¥¹¥Æ¥£¥ó¥° ½ªÎ»
$counterServiceHost.Close();
# ¥¨¥é¡¼¥È¥é¥Ã¥×
trap
{
if (($counterServiceHost -ne $()) -and ($counterServiceHost.State -eq [System.ServiceModel.CommunicationState]::Opened))
{
$counterServiceHost.Close();
}
break;
}
}
¤³¤Î´Ø¿ô¤ò¸Æ¤Ó½Ð¤»¤Ð¡¢PowerShell ¾å¤Ç WCF ¥Û¥¹¥Æ¥£¥ó¥°¤¬³«»Ï¤µ¤ì¤Þ¤¹¡£
¤³¤Î´Ø¿ô¤ò¸Æ¤Ó½Ð¤¹¤Ë¤Ï¡¢°Ê²¼¤Î¥³¡¼¥É¤ò¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤¡£
ExecuteCounterServiceHosting;
À®¸ù¤¹¤ë¤È¡¢°Ê²¼¤Î¤è¤¦¤Ê¥á¥Ã¥»¡¼¥¸¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£
WCF ¥µ¡¼¥Ó¥¹ ¤Î ¥Û¥¹¥Æ¥£¥ó¥°¤ò³«»Ï¤·¤Þ¤·¤¿¡£
Listening uri: net.tcp://localhost:10000/Sample/WCFServices/CounterService.svc
Enter ¥¡¼¤ò²¡¤¹¤È½ªÎ»¤·¤Þ¤¹¡£
¥Û¥¹¥Æ¥£¥ó¥°¤ò½ªÎ»¤µ¤»¤ë¤Ë¤Ï¡¢Enter ¥¡¼¤ò²¡¤·¤Þ¤¹¡£ ( ¤Ç¤â¡¢¤Þ¤À²¡¤·¤Á¤ã¤À¤á¡ä¡ã )
[ 3. PowerShell ¤Ç WCF ¥µ¡¼¥Ó¥¹¤Ë¥¢¥¯¥»¥¹ ]
¸½ºß³«¤¤¤Æ¤¤¤ë PowerShell ¤È¤ÏÊ̤ˡ¢¤â¤¦¤Ò¤È¤Ä PowerShell¤òµ¯Æ°¤·¤Æ¤¯¤À¤µ¤¤¡£
¤³¤ÎÊÌ PowerShell ¤¬¡¢¥¯¥é¥¤¥¢¥ó¥È¤òôÅö¤·¤Þ¤¹¡£
ConnectToCounterService ¤È¤¤¤¦´Ø¿ô¤òÄêµÁ¤·¡¢¤½¤ÎÃæ¤Ç WCF ¥µ¡¼¥Ó¥¹¤Ø¤Î¥¢¥¯¥»¥¹¤Î°ìÏ¢¤Î½èÍý¤ò¹Ô¤¤¤Þ¤¹¡£
°Ê²¼¤Î¥³¡¼¥É¤òÁ´¤Æ¥³¥Ô¡¼¤·¡¢PowerShell ¤ËޤêÉÕ¤±¤Æ¤¯¤À¤µ¤¤¡£
function ConnectToCounterService
{
# WCFɬ¿Ü¤Î¥¯¥é¥¹ ¥é¥¤¥Ö¥é¥ê
[void][System.Reflection.Assembly]::LoadWithPartialName("System.ServiceModel");
# ¼«ºî¤Î WCF ¥µ¡¼¥Ó¥¹ ¥¯¥é¥¹ ¥é¥¤¥Ö¥é¥ê
[void][System.Reflection.Assembly]::LoadWithPartialName("Sample.WCFServices");
# CounterService ¤Î¥Á¥ã¥Í¥ë¤òÀ¸À®
$contractAssemblyQualifiedName = [Sample.WCFServices.ICounterService].AssemblyQualifiedName;
$counterServiceBinding = New-Object "System.ServiceModel.NetTcpBinding" @([System.ServiceModel.SecurityMode]::None);
$counterServiceChannelFactory = New-Object "System.ServiceModel.ChannelFactory``1[[$contractAssemblyQualifiedName]]" @($counterServiceBinding, "net.tcp://localhost:10000/Sample/WCFServices/CounterService.svc");
$counterServiceProxy = $counterServiceChannelFactory.CreateChannel();;
# ÁªÂò»èºîÀ®
$accessMethodChoice = New-Object "System.Management.Automation.Host.ChoiceDescription" @("&Access", "CounterService ¥µ¡¼¥Ó¥¹¤Î Access ¥á¥½¥Ã¥É¤ò¼Â¹Ô");
$releaseMethodChoice = New-Object "System.Management.Automation.Host.ChoiceDescription" @("&Release", "CounterService ¥µ¡¼¥Ó¥¹¤Î Release ¥á¥½¥Ã¥É¤ò¼Â¹Ô");
$getCountMethodChoice = New-Object "System.Management.Automation.Host.ChoiceDescription" @("&GetCount", "CounterService ¥µ¡¼¥Ó¥¹¤Î GetCount ¥á¥½¥Ã¥É¤ò¼Â¹Ô¤·¤ÆÌá¤êÃͤòɽ¼¨");
$exitChoice = New-Object "System.Management.Automation.Host.ChoiceDescription" @("&Exit", "½ªÎ»");
$methodChoiceDescription = [System.Management.Automation.Host.ChoiceDescription[]]@($accessMethodChoice, $releaseMethodChoice, $getCountMethodChoice, $exitChoice);
# ¥á¥½¥Ã¥ÉÁªÂò»è¥ë¡¼¥×
$run = $True;
while ($run)
{
$result = $Host.UI.PromptFOrChoice("[ ½èÍýÁªÂò ]", [System.String]::Empty, $methodChoiceDescription, 0);
switch ($result)
{
0 {$counterServiceProxy.Access();},
1 {$counterServiceProxy.Release();},
2 {$counterServiceProxy.GetCount();},
3 {$run = $False;}
}
}
# ¸å½èÍý
# ¥×¥í¥¥· ¥ª¥Ö¥¸¥§¥¯¥È¤ò IClientChannel ¤Ë¥¥ã¥¹¥È¤·¤Æ Close¤·¤¿¤¤¤ó¤À¤±¤ÉPowerShell ¤Î¥¥ã¥¹¥È ¥Á¥§¥Ã¥¯¤ËÃÆ¤«¤ì¤ë¡£
# ChannelFactory ¤Î Close ¥á¥½¥Ã¥É¤¬ÆâÉô¤Ç Close ¤·¤Æ¤¯¤ì¤Æ¤¤¤ë¤«¤é¤Þ¤¡¤¤¤¤¤ó¤À¤±¤É^^;
#$counterServiceChannel = [System.ServiceModel.IClientChannel]$counterServiceProxy
#$counterServiceChannel.Close();
$counterServiceChannelFactory.Close();
# ¥¨¥é¡¼¥È¥é¥Ã¥×
trap
{
if (($counterServiceChannelFactory -ne $()) -and ($counterServiceChannelFactory.State -eq [System.ServiceModel.CommunicationState]::Opened))
{
#if (($counterServiceChannel -ne $()) -and ($counterServiceChannel.State -eq [System.ServiceModel.CommunicationState]::Opened))
#{
# $counterServiceChannel.Close();
#}
$counterServiceChannelFactory.Close();
}
}
}
¤³¤Î´Ø¿ô¤ò¸Æ¤Ó½Ð¤»¤Ð¡¢PowerShell ¾å¤Ç CounterService ¥µ¡¼¥Ó¥¹¤Ø¤Î¥¢¥¯¥»¥¹¤¬¹Ô¤¨¤Þ¤¹¡£
¤³¤Î´Ø¿ô¤ò¸Æ¤Ó½Ð¤¹¤Ë¤Ï¡¢°Ê²¼¤Î¥³¡¼¥É¤ò¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤¡£ ( ¤µ¤Ã¤ºîÀ®¤·¤¿ ExecuteCounterServiceHosting ´Ø¿ô¤Ï¤Á¤ã¤ó¤È¼Â¹ÔÃæ¤Î¤Þ¤Þ¤Ë¤·¤Æ¤¢¤ê¤Þ¤¹¤è¤Í¡© )
ConnectToCounterService;
À®¸ù¤¹¤ë¤È¡¢°Ê²¼¤Î¤è¤¦¤Ê¥á¥Ã¥»¡¼¥¸¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£
[ ½èÍýÁªÂò ]
[A] Access [R] Release [G] GetCount [E] Exit [?] ¥Ø¥ë¥× (´ûÄêÃÍ¤Ï "A"):
¼Â¹Ô¤·¤¿¤¤½èÍý¤ÎƬʸ»ú¤òÆþÎϤ·¤Æ Enter ¤ò²¡¤»¤Ð¡¢½èÍý¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£³Æ½èÍý¤ÎÀâÌÀ¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢ "?" ¤ÈÆþÎϤ·¤Æ Enter ¤ò²¡¤·¤Æ¤¯¤À¤µ¤¤¡£
[ 4. ´°À® ]
¤³¤ì¤Ç´°À®¤Ç¤¹¡£¥¯¥é¥¤¥¢¥ó¥È¤òÊ£¿ôÍѰդ·¤¿¤ê¤·¤Æ»î¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
[ 5. ¥¹¥¯¥ê¥×¥È ¥Õ¥¡¥¤¥ë²½ ]
Ëè²ó¥³¥Þ¥ó¥É¤ò¥³¥Ô¥Ú¤¸¤ã¤¢¤Á¤ç¤Ã¤ÈÉÔÊØ¤Ê¤Î¤Ç¡¢¥¹¥¯¥ê¥×¥È ¥Õ¥¡¥¤¥ë¤È¤·¤ÆÊݸ¤·¤Æ¤ª¤¯ÊýË¡¤òºÇ¸å¤Ë¾Ò²ð¤·¤Æ¤ª¤¤Þ¤¹¡£
PowerShell ¤Î¥¹¥¯¥ê¥×¥È ¥Õ¥¡¥¤¥ë¤Î³ÈÄ¥»Ò¤Ï "ps1" ¤Ç¤¹¡£
¤¿¤À¡¢PowerShell ¤Î´ûÄê¤ÎÀßÄê¤Ç¤Ï¥¹¥¯¥ê¥×¥È ¥Õ¥¡¥¤¥ë¤Î¼Â¹Ô¤¬µö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£
°Ê²¼¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¡¢¥í¡¼¥«¥ë¥Õ¥¡¥¤¥ë¤È¤·¤ÆÊݸ¤µ¤ì¤Æ¤¤¤ë¥¹¥¯¥ê¥×¥È ¥Õ¥¡¥¤¥ë¤Î¼Â¹Ô¤¬µö²Ä¤µ¤ì¤ë¤è¤¦¤ËÀßÄ꤬Êѹ¹¤µ¤ì¤Þ¤¹¡£
Set-ExecutionPolicy RemoteSigned
¤³¤Î¤¢¤¿¤ê¤Î¾ÜºÙ¤Ê²òÀâ¤Ï¡¢°Ê²¼¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ç¸«¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£¤³¤Î²òÀâ¤òÆÉ¤ó¤À¾å¤Ç¡¢¾åµ¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤«¤É¤¦¤«¤òȽÃǤ·¤Æ¤¯¤À¤µ¤¤¡£
get-help about_signing | out-host -paging
¤Ç¡¢¥¹¥¯¥ê¥×¥È ¥Õ¥¡¥¤¥ë¤Î¼Â¹ÔÊýË¡¤Ç¤¹¤¬¡¢¥Õ¥¡¥¤¥ë̾¤ò ( ɬ¤º¥Ñ¥¹ÉÕ¤¤Ç ) ÆþÎϤ·¤Æ Enter ¤ò²¡¤¹¤À¤±¤Ç¤¹¡£¤¢¤È¡¢PowerShell ¤Îµ¯Æ°»þ¤Ë¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤È¤·¤Æ¥¹¥¯¥ê¥×¥È ¥Õ¥¡¥¤¥ë¤Î¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Æ¤ä¤Ã¤Æ¤â¼Â¹Ô¤µ¤ì¤Þ¤¹¡£


