<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>SOA関連</title><link>http://blogs.wankuma.com/ganfield/category/1080.aspx</link><description>SOA関連の話題です。Webサービスはここに含みます。</description><managingEditor>がんふぃーるど(ganfield@wankuma.com)</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>がんふぃーるど(ganfield@wankuma.com)</dc:creator><title>レッツら Windows Communication Foundation - インスタンスのライフサイクル</title><link>http://blogs.wankuma.com/ganfield/archive/2007/04/15/71480.aspx</link><pubDate>Sun, 15 Apr 2007 00:50:00 GMT</pubDate><guid>http://blogs.wankuma.com/ganfield/archive/2007/04/15/71480.aspx</guid><wfw:comment>http://blogs.wankuma.com/ganfield/comments/71480.aspx</wfw:comment><comments>http://blogs.wankuma.com/ganfield/archive/2007/04/15/71480.aspx#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ganfield/comments/commentRss/71480.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ganfield/services/trackbacks/71480.aspx</trackback:ping><description>&lt;P&gt;わんくま勉強会＃６のかるぼさんのセッションにインスパイアされて調べました。キッカケはかるぼさんがCountUpというWebMethod(WCFではOperationContract)を作った時、フィールドに値を保持しようとしていたことです。（ちなみに、下記の内容はほとんどセッション後に話してたものだったりしますｗ）&lt;/P&gt;
&lt;P&gt;　&lt;/P&gt;
&lt;P&gt;まず、WCFのインスタンスのライフサイクルを説明する前に、WCFが登場する以前の.NET RemotingだったりWebサービス(asmx)のインスタンスのライフサイクルをおさらいしたいと思います。&lt;/P&gt;
&lt;P&gt;といったところで、いくつもあるわけではないのでサクっと行きます。&lt;/P&gt;
&lt;P&gt;　&lt;/P&gt;
&lt;P&gt;１．要求ごとにインスタンスを生成する。&lt;/P&gt;
&lt;P&gt;WebサービスやASP.NETがこのタイプです。.NET Remoting も設定でこのタイプを指定することができます。&lt;/P&gt;
&lt;P&gt;　&lt;/P&gt;
&lt;P&gt;２．インスタンスを一つだけ生成する。（Singleton）&lt;/P&gt;
&lt;P&gt;.NET Remotingは設定でこのタイプを指定することができます。&lt;/P&gt;
&lt;P&gt;　&lt;/P&gt;
&lt;P&gt;この二つのパターンがあります。&lt;/P&gt;
&lt;P&gt;では、WCFではどうなったかというと、上記の二つに加え、&lt;STRONG&gt;セッションごとにインスタンスを生成する&lt;/STRONG&gt;というものが増えています。つまり、&lt;/P&gt;
&lt;P&gt;　&lt;/P&gt;
&lt;P&gt;３．セッションごとにインスタンスを生成する。&lt;/P&gt;
&lt;P&gt;　&lt;/P&gt;
&lt;P&gt;というのが3つ目の選択肢がWCFで新たに追加されています。簡単に言ってしまえば、クライアントごとにインスタンスを生成するというもので、ステートフルなサービスを作ることができます。ASP.NETのセッションと同じですね。設定方法は以下の通り&lt;/P&gt;
&lt;P&gt;　&lt;/P&gt;
&lt;P&gt;[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]&lt;BR&gt;public class MyService : IMyService 
&lt;P&gt;　 
&lt;P&gt;IMyServiceはServiceContract、つまりサービスとして公開するインターフェースです。MyServiceはその実装で、その実装クラスにServiceBehaviorAttributeを付け、InstanceContextMode=InstanceContextMode.PerSessionを設定します。InstanceContextModeの列挙体は上記の説明からわかるように三つの値があります。 
&lt;P&gt;　&lt;/P&gt;
&lt;P&gt;InstanceContextMode.PerCall&lt;BR&gt;InstanceContextMode.Singleton&lt;BR&gt;InstanceContextMode.PerSession&lt;/P&gt;
&lt;P&gt;　&lt;/P&gt;
&lt;P&gt;ところで、PerSessionでセッションごとにインスタンスを生成できるのはいいんだけど、サーバを&lt;STRONG&gt;&lt;FONT size=5&gt;クラスタ化&lt;/FONT&gt;&lt;/STRONG&gt;している場合どうするんだろうか&amp;#8230;ASP.NETみたいにDBに状態を保持させたりなんてできるのかな&amp;#8230;それともロードバランサー側でクライアントのセッションが繋がるように割り振れということなのだろうか&amp;#8230;というか、やっぱり分散系のベストプラクティスにあるようにステートレスな設計しなさいってことかな(&amp;#180;・ω・`)ｼｮﾎﾞｰﾝ&lt;/P&gt;
&lt;P&gt;orz&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ganfield/aggbug/71480.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>がんふぃーるど(ganfield@wankuma.com)</dc:creator><title>レッツら Web Services Enhancements 3.0 (WSE 3.0) - 簡単な認証</title><link>http://blogs.wankuma.com/ganfield/archive/2007/04/06/70442.aspx</link><pubDate>Fri, 06 Apr 2007 17:28:00 GMT</pubDate><guid>http://blogs.wankuma.com/ganfield/archive/2007/04/06/70442.aspx</guid><wfw:comment>http://blogs.wankuma.com/ganfield/comments/70442.aspx</wfw:comment><comments>http://blogs.wankuma.com/ganfield/archive/2007/04/06/70442.aspx#Feedback</comments><slash:comments>570</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ganfield/comments/commentRss/70442.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ganfield/services/trackbacks/70442.aspx</trackback:ping><description>&lt;P&gt;　SOAPをHTTPにバインディングしている限り不要とも思えるWSE。しかし、WCFにも組み込まれると言われれば無視することもできません（？）。一応Amazon Web Serviceでも少し使っているみたいだし、どんなことができるのか調べてみましょう。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;WSE 3.0 のインストール&lt;/H5&gt;
&lt;P&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=018a09fd-3a74-43c5-8ec1-8d789091255d&amp;amp;displaylang=en"&gt;Web Services Enhancements (WSE) 3.0 for Microsoft .NET&lt;/A&gt; からダウンロードしてインストール。尚、インストールする前に一度もVisual Studio 2005 を起動したことがないと、ソリューションエクスプローラのコンテキストメニューに[WSE Setting 3.0]が表示されないみたいです。再インストール時には気をつけねば&amp;#8230; 
&lt;DIV style="BORDER-RIGHT: gray 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: gray 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: gray 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: gray 1px solid"&gt;さらに注意：VistaのVisual Studio 2005 のコンテキストメニューに[WSE Setting 3.0]が表示させるにはマニュアルでアドインを追加するしかないみたいです。何度かインストールとアンインストールを繰り返して試してみたのですがダメでした。ユーザのフォルダ構成が変わったからかもしれません。C:\Users\ganfield\Documents\Visual Studio 2005にAddinsフォルダを作成し、その中にWindows XP等から持ってきたアドインファイルをコピったらコンテキストメニューに[WSE Setting 3.0]が表示されました。アドインファイルはC:\Documents and Settings\All Users\Application Data\Microsoft\MSEnvShared\Addinsにあります。（ここ以外の場合もあります。詳しくはVisual Studio 2005 の[オプション]のアドインファイルパスを参照） &lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;WSE 3.0 を使ったWebサービスサーバ&lt;/H5&gt;
&lt;OL&gt;
&lt;LI&gt;[新規作成]→[Webサイト]からASP.NET Webサービスを作成します。 
&lt;LI&gt;参照にMicrosoft.Web.Service3を追加します。 
&lt;LI&gt;[ソリューションエクスプローラ]から[WSE Setting 3.0]を起動します。 
&lt;LI&gt;[General]タブで[Enable this project for Web Services Enhancements]と[Enable Microsoft Web Services Enhancement SOAP Protocol Factory]のチェックボックスをオンにする。 
&lt;LI&gt;[Policy]タブで[Enable Policy]チェックボックスをオンにし、[Edit Application Policy]パネルにある[Add]ボタンを押す。Policyの名前を「UsernameServerPolicy」とし、[OK]を押す。 
&lt;LI&gt;新たに出てきたダイログボックスで[Next]を押し、Authentication Settings画面で[Secure a service application]と[username]ラジオボタンをオンにし、[Next]を押す。 
&lt;LI&gt;User and Roles画面で、[Perform Authorization]チェックボックスをオンにし、アクセス権を与えるユーザを選び、[Next]を押す。ユーザ名はしっかりと「コンピュータ名\ユーザ名」で記述する必要があります。 
&lt;LI&gt;Message Protection画面で[Protection Order]の[None]ラジオボタンをオンにし、[Next]を押します。 
&lt;LI&gt;Create Secure Settings画面で設定を確認したら[Finish]を押します。 
&lt;LI&gt;Web.configの内容とwse3policyCache.configファイルが自動生成されます。 
&lt;LI&gt;WebサービスのクラスにPolicyAttributeを付与します。Policy名は先ほど作成したUsernameServerPolicyを使用します。 &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;[WebService(Namespace = "http://ganfield.website4.org/")] 
&lt;P&gt;[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
&lt;P&gt;[Policy("UsernameServerPolicy")] 
&lt;P&gt;public class Service : System.Web.Services.WebService 
&lt;P&gt;
&lt;P&gt;&lt;STRONG&gt;サーバ側のコード&lt;/STRONG&gt; &lt;PRE&gt;using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using Microsoft.Web.Services3;
 
[WebService(Namespace = "http://ganfield.website4.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[Policy("UsernameServerPolicy")]
public class Service : System.Web.Services.WebService
{
    public Service () {
    }
 
    [WebMethod]
    public string HelloWorld(string name) {
        return "Hello World " + name + " !!";
    }
    
}
&lt;/PRE&gt;
&lt;P&gt;
&lt;P&gt;&lt;STRONG&gt;web.config&lt;/STRONG&gt; &lt;PRE&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;configuration&amp;gt;
  &amp;lt;configSections&amp;gt;
    &amp;lt;section name="microsoft.web.services3" type="Microsoft.Web.Services3.Configuration.WebServicesConfiguration, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /&amp;gt;
  &amp;lt;/configSections&amp;gt;
  &amp;lt;system.web&amp;gt;
    &amp;lt;webServices&amp;gt;
      &amp;lt;soapExtensionImporterTypes&amp;gt;
        &amp;lt;add type="Microsoft.Web.Services3.Description.WseExtensionImporter, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /&amp;gt;
      &amp;lt;/soapExtensionImporterTypes&amp;gt;
      &amp;lt;soapServerProtocolFactory type="Microsoft.Web.Services3.WseProtocolFactory, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /&amp;gt;
    &amp;lt;/webServices&amp;gt;
    &amp;lt;compilation debug="true"&amp;gt;
      &amp;lt;assemblies&amp;gt;
        &amp;lt;add assembly="Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /&amp;gt;
        &amp;lt;!--&amp;lt;add assembly="Microsoft.Web.Services2, Version=2.0.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /&amp;gt;--&amp;gt;
      &amp;lt;/assemblies&amp;gt;
    &amp;lt;/compilation&amp;gt;
  &amp;lt;/system.web&amp;gt;
  &amp;lt;microsoft.web.services3&amp;gt;
    &amp;lt;security&amp;gt;
    &amp;lt;/security&amp;gt;
    &amp;lt;policy fileName="wse3policyCache.config" /&amp;gt;
  &amp;lt;/microsoft.web.services3&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/PRE&gt;
&lt;P&gt;
&lt;P&gt;&lt;STRONG&gt;wse3policyCache.config&lt;/STRONG&gt; &lt;PRE&gt;&amp;lt;policies xmlns="http://schemas.microsoft.com/wse/2005/06/policy"&amp;gt;
  &amp;lt;extensions&amp;gt;
    &amp;lt;extension name="authorization" type="Microsoft.Web.Services3.Design.AuthorizationAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /&amp;gt;
    &amp;lt;extension name="usernameForCertificateSecurity" type="Microsoft.Web.Services3.Design.UsernameForCertificateAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /&amp;gt;
    &amp;lt;extension name="x509" type="Microsoft.Web.Services3.Design.X509TokenProvider, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /&amp;gt;
    &amp;lt;extension name="requireActionHeader" type="Microsoft.Web.Services3.Design.RequireActionHeaderAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /&amp;gt;
    &amp;lt;extension name="usernameOverTransportSecurity" type="Microsoft.Web.Services3.Design.UsernameOverTransportAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /&amp;gt;
  &amp;lt;/extensions&amp;gt;
  &amp;lt;policy name="UsernameServerPolicy"&amp;gt;
    &amp;lt;authorization&amp;gt;
      &amp;lt;allow user="コンピュータ名\ユーザ名" /&amp;gt;
      &amp;lt;deny user="*" /&amp;gt;
    &amp;lt;/authorization&amp;gt;
    &amp;lt;usernameOverTransportSecurity /&amp;gt;
    &amp;lt;requireActionHeader /&amp;gt;
  &amp;lt;/policy&amp;gt;
&amp;lt;/policies&amp;gt;
&lt;/PRE&gt;
&lt;P&gt;
&lt;H5&gt;WSE 3.0 を使ったWebサービスクライアント&lt;/H5&gt;
&lt;OL&gt;
&lt;LI&gt;[新規作成]→[プロジェクト]からコンソールアプリを作成します。 
&lt;LI&gt;Web参照にWebサービスを追加します。 
&lt;LI&gt;参照にMicrosoft.Web.Service3を追加します。 
&lt;LI&gt;[ソリューションエクスプローラ]で[すべてをファイルを表示]をオンにし、[Web Reference]の中からReference.csを探し出し、コードを表示します。 
&lt;LI&gt;Reference.csのプロキシクラスのスーパークラスをMicrosoft.Web.Services3.WebServicesClientProtocolに変更します。(プロキシクラスにサービス名 + Wseというクラスがある場合、5．の作業は飛ばして下さい。WSDLツールがWSEに対応したクラスを自動生成しています。) 
&lt;LI&gt;[ソリューションエクスプローラ]から[WSE Setting 3.0]を起動します。 
&lt;LI&gt;[General]タブで[Enable this project for Web Services Enhancements]チェックボックスをオンにする。 
&lt;LI&gt;[Policy]タブで[Enable Policy]チェックボックスをオンにし、[Edit Application Policy]パネルにある[Add]ボタンを押す。Policyの名前を「UsernameClientPolicy」とし、[OK]を押す。 
&lt;LI&gt;新たに出てきたダイログボックスで[Next]を押し、Authentication Settings画面で[Secure a client application]と[username]ラジオボタンをオンにし、[Next]を押す。 
&lt;LI&gt;Optionally provide Username and Password画面で、ユーザ名とパスワードを入力し、[Next]を押す。ユーザ名の前にコンピュータ名を記述する必要はありません。 
&lt;LI&gt;Message Protection画面で[Protection Order]の[None]ラジオボタンをオンにし、[Next]を押します。 
&lt;LI&gt;Create Secure Settings画面で設定を確認したら[Finish]を押します。 
&lt;LI&gt;app.configの内容とwse3policyCache.configファイルが自動生成されます。 
&lt;LI&gt;プロキシクラスのSetPolicyメソッドを使用してPolicyを設定します。Policy名は先ほど作成したUsernameClientPolicyを使用します。 proxy.SetPolicy("UsernameClientPolicy"); 
&lt;LI&gt;ビルドして実行する。 &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;
&lt;P&gt;&lt;STRONG&gt;クライアント側のコード&lt;/STRONG&gt; &lt;PRE&gt;using System;
using System.Collections.Generic;
using System.Text;
 
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            WebSite4.SampleServiceWse proxy = new WebSite4.SampleServiceWse();
            proxy.SetPolicy("UsernameClientPolicy");
            Console.WriteLine(proxy.HelloWorld("aaa"));
            Console.ReadLine();
        }
    }
}

&lt;/PRE&gt;
&lt;P&gt;
&lt;P&gt;&lt;STRONG&gt;app.config&lt;/STRONG&gt;&lt;PRE&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;configuration&amp;gt;
  &amp;lt;configSections&amp;gt;
    &amp;lt;sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"&amp;gt;
      &amp;lt;section name="ConsoleApplication2.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /&amp;gt;
    &amp;lt;/sectionGroup&amp;gt;
    &amp;lt;section name="microsoft.web.services3" type="Microsoft.Web.Services3.Configuration.WebServicesConfiguration, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /&amp;gt;
  &amp;lt;/configSections&amp;gt;
  &amp;lt;applicationSettings&amp;gt;
    &amp;lt;ConsoleApplication2.Properties.Settings&amp;gt;
      &amp;lt;setting name="ConsoleApplication2_WebReference_Service" serializeAs="String"&amp;gt;
        &amp;lt;value&amp;gt;http://192.168.xx.yy/testwebroot/website4/SampleService.asmx&amp;lt;/value&amp;gt;
      &amp;lt;/setting&amp;gt;
    &amp;lt;/ConsoleApplication2.Properties.Settings&amp;gt;
  &amp;lt;/applicationSettings&amp;gt;
  &amp;lt;microsoft.web.services3&amp;gt;
    &amp;lt;policy fileName="wse3policyCache.config" /&amp;gt;
  &amp;lt;/microsoft.web.services3&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/PRE&gt;
&lt;P&gt;
&lt;P&gt;&lt;STRONG&gt;wse3policyCache.config&lt;/STRONG&gt; &lt;PRE&gt;&amp;lt;policies xmlns="http://schemas.microsoft.com/wse/2005/06/policy"&amp;gt;
  &amp;lt;extensions&amp;gt;
    &amp;lt;extension name="usernameOverTransportSecurity" type="Microsoft.Web.Services3.Design.UsernameOverTransportAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /&amp;gt;
    &amp;lt;extension name="username" type="Microsoft.Web.Services3.Design.UsernameTokenProvider, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /&amp;gt;
    &amp;lt;extension name="requireActionHeader" type="Microsoft.Web.Services3.Design.RequireActionHeaderAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /&amp;gt;
  &amp;lt;/extensions&amp;gt;
  &amp;lt;policy name="UsernameClientPolicy"&amp;gt;
    &amp;lt;usernameOverTransportSecurity&amp;gt;
      &amp;lt;clientToken&amp;gt;
        &amp;lt;username username="ユーザ名" password="ひ・み・つ" /&amp;gt;
      &amp;lt;/clientToken&amp;gt;
    &amp;lt;/usernameOverTransportSecurity&amp;gt;
    &amp;lt;requireActionHeader /&amp;gt;
  &amp;lt;/policy&amp;gt;
&amp;lt;/policies&amp;gt;
&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;SOAP Request&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA rows=10 cols=100&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt; &amp;lt;soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"&amp;gt; &amp;lt;soap:Header&amp;gt; &amp;lt;wsa:Action&amp;gt;http://ganfield.website4.org/HelloWorld&amp;lt;/wsa:Action&amp;gt; &amp;lt;wsa:MessageID&amp;gt;urn:uuid:a51cc49c-29c8-4527-8deb-363869783c4f&amp;lt;/wsa:MessageID&amp;gt; &amp;lt;wsa:ReplyTo&amp;gt;&amp;lt;wsa:Address&amp;gt;http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous&amp;lt;/wsa:Address&amp;gt;&amp;lt;/wsa:ReplyTo&amp;gt; &amp;lt;wsa:To&amp;gt;http://192.168.xx.yy/testwebroot/WebSite4/SampleService.asmx&amp;lt;/wsa:To&amp;gt; &amp;lt;wsse:Security soap:mustUnderstand="1"&amp;gt; &amp;lt;wsu:Timestamp wsu:Id="Timestamp-74c3a4e2-9923-40ad-93d0-3147406af0e1"&amp;gt; &amp;lt;wsu:Created&amp;gt;2007-04-06T06:48:48Z&amp;lt;/wsu:Created&amp;gt; &amp;lt;wsu:Expires&amp;gt;2007-04-06T06:53:48Z&amp;lt;/wsu:Expires&amp;gt;&amp;lt;/wsu:Timestamp&amp;gt; &amp;lt;wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-250c3a6d-4c57-4d67-acc3-953edf5ef386"&amp;gt;&amp;lt;wsse:Username&amp;gt;ユーザ名&amp;lt;/wsse:Username&amp;gt; &amp;lt;wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"&amp;gt;ひ・み・つ&amp;lt;/wsse:Password&amp;gt; &amp;lt;wsse:Nonce&amp;gt;bzctbWS0X4c171/2qEIN1Q==&amp;lt;/wsse:Nonce&amp;gt;&amp;lt;wsu:Created&amp;gt;2007-04-06T06:48:48Z&amp;lt;/wsu:Created&amp;gt; &amp;lt;/wsse:UsernameToken&amp;gt; &amp;lt;/wsse:Security&amp;gt; &amp;lt;/soap:Header&amp;gt; &amp;lt;soap:Body&amp;gt;&amp;lt;HelloWorld xmlns="http://ganfield.website4.org/"&amp;gt;&amp;lt;name&amp;gt;aaa&amp;lt;/name&amp;gt;&amp;lt;/HelloWorld&amp;gt;&amp;lt;/soap:Body&amp;gt; &amp;lt;/soap:Envelope&amp;gt; &lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;SOAP Response&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA rows=10 cols=100&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt; &amp;lt;soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"&amp;gt; &amp;lt;soap:Header&amp;gt; &amp;lt;wsa:Action&amp;gt;http://ganfield.website4.org/HelloWorldResponse&amp;lt;/wsa:Action&amp;gt; &amp;lt;wsa:MessageID&amp;gt;urn:uuid:37747218-30ca-4ee7-94e2-38a368f84f7c&amp;lt;/wsa:MessageID&amp;gt;&amp;lt;wsa:RelatesTo&amp;gt;urn:uuid:a51cc49c-29c8-4527-8deb-363869783c4f&amp;lt;/wsa:RelatesTo&amp;gt;&amp;lt;wsa:To&amp;gt;http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous&amp;lt;/wsa:To&amp;gt; &amp;lt;wsse:Security&amp;gt; &amp;lt;wsu:Timestamp wsu:Id="Timestamp-7ae96393-a056-49c9-9b4d-5032d47c1759"&amp;gt; &amp;lt;wsu:Created&amp;gt;2007-04-06T06:49:00Z&amp;lt;/wsu:Created&amp;gt; &amp;lt;wsu:Expires&amp;gt;2007-04-06T06:54:00Z&amp;lt;/wsu:Expires&amp;gt; &amp;lt;/wsu:Timestamp&amp;gt; &amp;lt;/wsse:Security&amp;gt; &amp;lt;/soap:Header&amp;gt; &amp;lt;soap:Body&amp;gt;&amp;lt;HelloWorldResponse xmlns="http://ganfield.website4.org/"&amp;gt;&amp;lt;HelloWorldResult&amp;gt;Hello World aaa !!&amp;lt;/HelloWorldResult&amp;gt;&amp;lt;/HelloWorldResponse&amp;gt;&amp;lt;/soap:Body&amp;gt; &amp;lt;/soap:Envelope&amp;gt;  &lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;今回は簡単な認証ということで、UsernameTokenを使用してWebサービスを拡張しましたが、この他にもセキュリティトークンとしてX509SecurityTokenやKerberosToken等があります。また、独自のセキュリティトークンを作成し、使用することもできます。相互運用面に関しては調査しないといけないかもしれませんが、よりセキュアなWebサービスを、と思う方は一度使ってみてはいかがでしょうか？ 
&lt;P&gt;え？SSL＋クライアント証明書で十分？ソンナ、ソンナ&amp;#8230;ｗ &lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ganfield/aggbug/70442.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>がんふぃーるど(ganfield@wankuma.com)</dc:creator><title>Webサービスを取り巻く技術 - UDDI</title><link>http://blogs.wankuma.com/ganfield/archive/2007/03/27/69214.aspx</link><pubDate>Tue, 27 Mar 2007 19:10:00 GMT</pubDate><guid>http://blogs.wankuma.com/ganfield/archive/2007/03/27/69214.aspx</guid><wfw:comment>http://blogs.wankuma.com/ganfield/comments/69214.aspx</wfw:comment><comments>http://blogs.wankuma.com/ganfield/archive/2007/03/27/69214.aspx#Feedback</comments><slash:comments>69</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ganfield/comments/commentRss/69214.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ganfield/services/trackbacks/69214.aspx</trackback:ping><description>&lt;P&gt;現在のWebサービスの重要な基盤技術といえば、ほとんどがSOAPとWSDL（RESTはちょっと抜かして）のことを指すと思うのですが、本などを購入すると大体のものがSOAPとWSDL、そしてUDDIをWebサービスの重要な基盤技術として説明しています。SOAPはHTTP上でメッセージのやり取りを行うためのXMLベースのプロトコル（本来は下位のプロトコルに依存しないのがSOAPですが、ここではWebサービスってことでHTTPに限定）、WSDLはそのサービスのインターフェースを記述するためのXMLベース言語として知られています。&lt;/P&gt;
&lt;P&gt;で、UDDIは？ 
&lt;P&gt;UDDIは利用者がWebサービスを検索できるようにするための（検索システムの）標準化資料です。要するにWebサービス開発者は公開するWebサービスの情報をUDDIレジストリ（ブローカー）に登録して、利用者が検索しやすいようにしちゃいましょうってものです。ちょっと前まではMicrosoftやIBM、SAPといったとこがUDDIレジストリを運用していました。 
&lt;P&gt;ん？ちょっと前まで？というか、Webサービスなんてググれば見つかるって？そもそもプロジェクトで使うWebサービスをわざわざ検索して探さないって？そうですね、そんなんですよね&amp;#8230;実はMicrosoft等が公開していたUDDIレジストリももう無くなっちゃいました。 
&lt;P&gt;&amp;nbsp;
&lt;P&gt;
&lt;P&gt;&lt;A href="http://www.infoworld.com/article/05/12/16/HNuddishut_1.html"&gt;Microsoft, IBM, SAP discontinue UDDI registry effort&lt;/A&gt; 
&lt;P&gt;&amp;nbsp;
&lt;P&gt;
&lt;P&gt;そもそも、ブローカーと言ったって、Webサービスを実装しているクライアントがUDDIを参照して、UDDI側がWebサービスを動的に選ぶなんてものではなく、単に検索エンジンみたいにWebサービスの情報を返すだけのものです。Webサービスなんて同じようなサービスでも会社が違えばインタフェースはまったく別物になってしまいますから、そんな難しいことはできません。 
&lt;P&gt;こうなると、UDDIの存在意義自体があやしくなってきます。特にパブリックなUDDIレジストリの必要性自体あまり無いように見えます。SOAな今だからUDDIが必要なんじゃーなんて記事（&lt;A href="http://searchwebservices.techtarget.com/qna/0,289202,sid26_gci1242398,00.html"&gt;Why SOA needs UDDI now&lt;/A&gt;）もありますが、どうでしょうか&amp;#8230;正直、UDDIなんぞよりWebサービスについて実装方法のサンプルまで載っているしっかりとしたドキュメントがある方が何倍も役に立ちますし、大企業であれば社内のIT部門がしっかりとポリシーなどを定義し、各プロジェクトに対して横断的な活動をしてくれた方がよっぽどいいです。 
&lt;P&gt;UDDIが100%廃れたと言うにはまだまだ早いと思いますが、（今のところ）あまり重要でないように思えてしまいます。UDDIのベストプラクティス集なんてのがどっさりと公開されたら、それに沿って使ってみる気になるかもしれませんが、現状を見る限りではその気はまったくありません&amp;#8230;しっかりとしたドキュメント作りに励みます！ 
&lt;P&gt;&amp;nbsp;
&lt;P&gt;# Windows Server 2003などにはUDDIサービスがあるみたいですが、果たして効率的に使っているプロジェクトはあるんでしょうか&amp;#8230; 
&lt;P&gt;&amp;nbsp;
&lt;P&gt;Reference 
&lt;P&gt;[1] SOAP/UDDI/WSDL Webサービス技術 基礎と実践 徹底解説 
&lt;P&gt;[2] &lt;A href="http://www.atmarkit.co.jp/fxml/tanpatsu/21websvc/websvc07.html"&gt;Webサービスを発見する仕組み～UDDI&lt;/A&gt; 
&lt;P&gt;[3] &lt;A href="http://www.microsoft.com/japan/msdn/uddi/default.asp"&gt;Microsoft Online ? UDDI Developer Center&lt;/A&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ganfield/aggbug/69214.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>がんふぃーるど(ganfield@wankuma.com)</dc:creator><title>Amazon Simple Storage Service その４ - DIME Attachment と拡張 -</title><link>http://blogs.wankuma.com/ganfield/archive/2007/03/07/65352.aspx</link><pubDate>Wed, 07 Mar 2007 00:37:00 GMT</pubDate><guid>http://blogs.wankuma.com/ganfield/archive/2007/03/07/65352.aspx</guid><wfw:comment>http://blogs.wankuma.com/ganfield/comments/65352.aspx</wfw:comment><comments>http://blogs.wankuma.com/ganfield/archive/2007/03/07/65352.aspx#Feedback</comments><slash:comments>152</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ganfield/comments/commentRss/65352.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ganfield/services/trackbacks/65352.aspx</trackback:ping><description>&lt;P&gt;&lt;/P&gt;
&lt;H3&gt;DIME Attachments S3 Bucket Browser 拡張&lt;/H3&gt;
&lt;P&gt;S3で1MB以上のデータを転送するためには、DIME という仕様を使う必要があります。AmazonのResourceCenterにあるサンプルS3 Bucket BrowserではDIMEを使用してデータのやり取りを行っていないので、今回はそこを拡張しようと思います。 
&lt;P&gt;まず、.NET FrameworkのWebサービスではDIMEを標準ではサポートしていないので、DIME Attachmentを使用するため、WSEをインストールします。ただし、最新のWSEではDIME Attachmentの部分をMTOMという仕様で置き換えてしまっているので、今回はWSE 1.0（注）を使用します。 
&lt;P&gt;注：WSE 2.0を使用してS3にアクセスしようとすると少々問題があるので（WSEの中のWS-Addressingの実装を強制され、サーバ側でエラーが発生する）、WSE 1.0を使用しています。 
&lt;P&gt; 
&lt;H4&gt;WSE 1.0 SP1 インストール&lt;/H4&gt;
&lt;P&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=06255a94-2635-4d29-a90c-28b282993a41&amp;amp;displaylang=en"&gt;WSE 1.0 SP1&lt;/A&gt; をダウンロードし、インストールします。 
&lt;P&gt; 
&lt;H4&gt;WSE 1.0 を参照に加える&lt;/H4&gt;
&lt;P&gt;Microsoft.Web.Serviceを参照に加えます。 
&lt;P&gt; 
&lt;H4&gt;コードの変更&lt;/H4&gt;
&lt;H4&gt;Webサービスプロキシの親クラスをMicrosoft.Web.Services.WebServicesClientProtocolに変更&lt;/H4&gt;
&lt;P&gt;まず、Visual Studioの[ソリューションエクスプローラ]で[すべてのファイルを表示]するようにします。 
&lt;P&gt;そうすると、[Web References]のcom.amazonaws.s3を展開できるようになるので、Refence.csというファイルを開きます。これはwsdlで作成されたプロキシクラスです。 
&lt;P&gt;このReference.csの中にあるプロキシクラスの親クラスをSystem.Web.Services.Protocols.SoapHttpClientProtocolからMicrosoft.Web.Services.WebServicesClientProtocolに変更します。 
&lt;P&gt; 
&lt;P&gt;public partial class AmazonS3 : Microsoft.Web.Services.WebServicesClientProtocol 
&lt;P&gt; 
&lt;P&gt; 
&lt;H4&gt;S3コンストラクタ&lt;/H4&gt;
&lt;P&gt;プロキシクラスの設定を行います。 
&lt;P&gt; 
&lt;P&gt;public S3(string sAccessKeyId, string sSecretKey) 
&lt;P&gt;{ 
&lt;P&gt;m_sAccessKeyId = sAccessKeyId; 
&lt;P&gt;m_sSecretAccessKey = sSecretKey; 
&lt;P&gt;m_objS3.RequestSoapContext.Path.MustUnderstand = false; // WS-Routing は使用しないので、falseにする。 
&lt;P&gt;} 
&lt;P&gt; 
&lt;H4&gt;S3.PutObject(string bucketName, string keyName, string fileName, long contentLength, string contentType)メソッド追加&lt;/H4&gt;
&lt;P&gt;内容はPutObjectInlineからコピってきます。基本的にはPutObjectInlineと一緒ですが、DIME Attachmentにアップロードするファイルを追加しましょう。 
&lt;P&gt; 
&lt;P&gt;m_objS3.RequestSoapContext.Attachments.Add(new Microsoft.Web.Services.Dime.DimeAttachment(contentType, Microsoft.Web.Services.Dime.TypeFormatEnum.MediaType, fileName)); 
&lt;P&gt;objS3PutObjectResult = m_objS3.PutObject(bucketName, keyName, aobjMetaDataEntries, contentLength, null, 0, false, AccessKeyId, timeStamp, true, sSignature, null); 
&lt;P&gt; 
&lt;H4&gt;S3.GetObjectメソッド修正&lt;/H4&gt;
&lt;P&gt;Objectを取得するときは、Webメソッドの引数でDIMEかInlineか選択できます。なので、S3.GetObjectメソッドにbool isOver1MBObjectというObjectのサイズが1MBを超えているかどうか判断できる引数を追加します。Webサービスから取得したDIME AttachmentのStreamはそのままファイルに焼き付けたほうが効率がいいのですが、今回はGetObjectResult.Dataにバイト配列として格納してしまいます。（コードの修正が少なくて済むので&amp;#8230;） 
&lt;P&gt; 
&lt;P&gt;public GetObjectResult GetObject(string bucketName, string keyName, bool isOver1MBObject) 
&lt;P&gt;{ 
&lt;P&gt;（中略） 
&lt;P&gt;try 
&lt;P&gt;{ 
&lt;P&gt;objS3GetObjectResult = m_objS3.GetObject(bucketName, keyName, true, true, !isOver1MBObject, AccessKeyId, timeStamp, true, sSignature, null); 
&lt;P&gt;m_bSoapError = false; 
&lt;P&gt;m_sSoapErrorMessage = ""; 
&lt;P&gt;if (isOver1MBObject) 
&lt;P&gt;{ 
&lt;P&gt;Stream stream = m_objS3.ResponseSoapContext.Attachments[0].Stream; 
&lt;P&gt;byte[] buffer = new byte[(int)stream.Length]; 
&lt;P&gt;stream.Read(buffer, 0, (int)stream.Length); 
&lt;P&gt;objS3GetObjectResult.Data = buffer; 
&lt;P&gt;} 
&lt;P&gt;} 
&lt;P&gt;（中略） 
&lt;P&gt;return objS3GetObjectResult; 
&lt;P&gt;} 
&lt;P&gt; 
&lt;H4&gt;Objectのサイズの取得&lt;/H4&gt;
&lt;P&gt;ファイルをアップロードしようとする場合はFileInfoなどで確認すれば良いのですが、ファイルをダウンロードしようとする場合は、listView1.Items[n].SubItems[3]から取得します。 
&lt;P&gt; 
&lt;H4&gt;コンパイルと実行&lt;/H4&gt;
&lt;P&gt;細々とした部分は省略しましたが、後はコンパイルして実行すれば1MB以上のデータをやりとりできるようになります。ちなみに、1MB以上のデータを画面右にドロップすると数秒間固まります（笑）。 
&lt;P&gt; 
&lt;P&gt;今回はWSEを使用してDIME Attachmentを使用してファイルを送受信するようにS3 Bucket Browserを拡張しましたが、Webサービス関連は調べれば調べるほど恐ろしくなってきますね&amp;#8230;まさに伏魔殿って感じです。最近の仕様もWSE関連は複雑化の一途を辿っている様に見えますし、もっと簡単にならないのかな&amp;#8230;日本語のドキュメントももっと作って欲しいなーなんて思ってますｗ 
&lt;P&gt; 
&lt;P&gt;# WSE 2.0 を使った場合についてですが、実は自分を中継サーバと勘違いさせ（m_objS3.Pipeline.IsIntermediary = true;）、パイプライン処理の最後でWS-Addressing等の情報を削除させることができます。これでいけることはいけるのですが、あまりにも強引な方法なので使わない方が良いと思います。それよりも、「Discussions in Web Services Enhancements」というマイクロソフトのニュースグループでWS-Addressingを無効にする話題に上っていて、パイプライン処理にカスタムクラスを差し込めばなんとかなりそうなことが書かれていました。ちょっとメールで問い合わせ中です。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ganfield/aggbug/65352.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>がんふぃーるど(ganfield@wankuma.com)</dc:creator><title>Amazon Simple Storage Service (S3) その３ - 認証 -</title><link>http://blogs.wankuma.com/ganfield/archive/2007/02/21/63355.aspx</link><pubDate>Wed, 21 Feb 2007 02:00:00 GMT</pubDate><guid>http://blogs.wankuma.com/ganfield/archive/2007/02/21/63355.aspx</guid><wfw:comment>http://blogs.wankuma.com/ganfield/comments/63355.aspx</wfw:comment><comments>http://blogs.wankuma.com/ganfield/archive/2007/02/21/63355.aspx#Feedback</comments><slash:comments>121</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ganfield/comments/commentRss/63355.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ganfield/services/trackbacks/63355.aspx</trackback:ping><description>&lt;H3&gt;SOAPの認証&lt;/H3&gt;
&lt;P&gt;AWSで認証が必要な場合、自力で署名を行う必要があります。ただ、署名と言ってもメッセージ全体をハッシュしたりするわけではなく、特定のフォーマットに従った文字列を署名（ハッシュ）することになります。結構簡単です。&lt;/P&gt;
&lt;H4&gt;AWSが提供するIDとキー&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;AccessKeyID &amp;#8230; ユーザのID。他人に知られても別に問題はありません。 
&lt;LI&gt;SecretAccessKey &amp;#8230; アクセスする為の秘密鍵。他人に知られてはダメです。これを使用し、署名を行います。署名に関しては後ほど述べます。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;S3では使用しませんが、他にもクライアント証明書が用意されています。 
&lt;P&gt;
&lt;H4&gt;署名&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;TimeStamp 
&lt;LI&gt;Signature&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Timestamp&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Timestampです。時間はユニバーサル時間（グリニッジ標準時間）で記述する必要があり、フォーマットは2005-01-31T23:59:59.183Zの様にします。このTimestampの時間とAWSのサーバの時間が15分以上ずれると失敗となるので注意しましょう。 
&lt;UL&gt;
&lt;LI&gt;Signature&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;署名です。署名は"AmazonS3" + OPERATION(メソッド名) + Timestampのハッシュ値を取ります。ハッシュの計算はHMAC-SHA1で行います。文字エンコーディングの話が出ていないのですが、ASCII文字以外出てきそうにないので、UTF-16とかを指定しない限り大丈夫そうです&amp;#8230;サンプルではUTF-8を使用していました。 
&lt;P&gt;注：DateTimeの精度についてですが、S3のサービスに合わせてミリ秒までの精度にする方が良いです。クライアント内部にキャッシュしているデータと比較したりする場合便利です。 
&lt;P&gt;
&lt;H4&gt;コードサンプル（&lt;A href="http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=46"&gt;ResourceCenter&lt;/A&gt;にある&lt;A href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=372&amp;amp;categoryID=47"&gt;C#サンプル&lt;/A&gt;からの抜粋）&lt;/H4&gt;
&lt;P&gt;// TimeStampのフォーマットとSignatureの計算に使用するデータのプリフィックス。 
&lt;P&gt;private const string c_sISODateFormat = "yyyy-MM-ddTHH:mm:ss.fffZ"; 
&lt;P&gt;private const string c_sAmazonS3 = "AmazonS3"; 
&lt;P&gt;// Timestamp用のDateTimeを取得 
&lt;P&gt;public DateTime Aws_GetDatestamp() 
&lt;P&gt;{ 
&lt;P&gt;&amp;nbsp;&amp;nbsp;DateTime dteCurrentDateTime; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;DateTime dteFriendlyDateTime; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;dteCurrentDateTime = DateTime.Now; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;dteFriendlyDateTime = new DateTime(dteCurrentDateTime.Year, 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dteCurrentDateTime.Month, dteCurrentDateTime.Day, 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dteCurrentDateTime.Hour, dteCurrentDateTime.Minute, 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dteCurrentDateTime.Second, 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dteCurrentDateTime.Millisecond, DateTimeKind.Local); 
&lt;P&gt;&amp;nbsp;&amp;nbsp;return dteFriendlyDateTime; 
&lt;P&gt;} 
&lt;P&gt;// グローバル時間（グリニッジ標準時間）に変換 
&lt;P&gt;public string Aws_GetISOtimeStamp(DateTime timeStamp) 
&lt;P&gt;{ 
&lt;P&gt;&amp;nbsp; string sISOtimeStamp; 
&lt;P&gt;&amp;nbsp; sISOtimeStamp = timeStamp.ToUniversalTime().ToString(c_sISODateFormat, System.Globalization.CultureInfo.InvariantCulture); 
&lt;P&gt;&amp;nbsp; return sISOtimeStamp; 
&lt;P&gt;} 
&lt;P&gt;// 署名 
&lt;P&gt;public string Aws_GetSignature(string operation, DateTime timeStamp) 
&lt;P&gt;{ 
&lt;P&gt;&amp;nbsp; string sSig_Raw; 
&lt;P&gt;&amp;nbsp; string sSignature; 
&lt;P&gt;&amp;nbsp; UTF8Encoding objUTF8Encoder; 
&lt;P&gt;&amp;nbsp; HMACSHA1 objHMACSHA1; 
&lt;P&gt;&amp;nbsp; sSig_Raw = c_sAmazonS3 + operation + Aws_GetISOtimeStamp(timeStamp); 
&lt;P&gt;&amp;nbsp; objUTF8Encoder = new UTF8Encoding(); 
&lt;P&gt;&amp;nbsp; objHMACSHA1 = new HMACSHA1(objUTF8Encoder.GetBytes(m_sSecretAccessKey)); 
&lt;P&gt;&amp;nbsp; sSignature = Convert.ToBase64String(objHMACSHA1.ComputeHash(objUTF8Encoder.GetBytes(sSig_Raw.ToCharArray()))); 
&lt;P&gt;&amp;nbsp; return sSignature; 
&lt;P&gt;} 
&lt;P&gt;ちなみに、認証付きのSOAPでS3にアクセスする場合、必ずSSLでアクセスしなければなりません。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ganfield/aggbug/63355.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>がんふぃーるど(ganfield@wankuma.com)</dc:creator><title>Amazon Simple Storage Service (S3) その２ - SOAP API -</title><link>http://blogs.wankuma.com/ganfield/archive/2007/02/18/62941.aspx</link><pubDate>Sun, 18 Feb 2007 23:08:00 GMT</pubDate><guid>http://blogs.wankuma.com/ganfield/archive/2007/02/18/62941.aspx</guid><wfw:comment>http://blogs.wankuma.com/ganfield/comments/62941.aspx</wfw:comment><comments>http://blogs.wankuma.com/ganfield/archive/2007/02/18/62941.aspx#Feedback</comments><slash:comments>435</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ganfield/comments/commentRss/62941.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ganfield/services/trackbacks/62941.aspx</trackback:ping><description>&lt;P&gt;&lt;IMG src="http://ganfield.wankuma.com/blog/20070218/s3_webref_20070218_1.jpg"&gt;&lt;/P&gt;
&lt;P&gt;（S3のWSDLをWeb参照に追加しようとしたときのウィンドウ）&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;SOAP API&lt;/H3&gt;
&lt;P&gt;Serviceに対する操作 (Operations on Service) 
&lt;P&gt;Bucketに対する操作 (Operations on Bucket) 
&lt;P&gt;Objectに対する操作 (Operations on Objects) 
&lt;P&gt;
&lt;H4&gt;Serviceに対する操作 (Operations on Service)&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;ListAllMyBuckets&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;一つしかありませんね。自分のService内にあるBucketの一覧を取得してくれます。 
&lt;P&gt;
&lt;H4&gt;Bucketに対する操作 (Operations on Bucket)&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;CreateBucket 
&lt;LI&gt;DeleteBucket 
&lt;LI&gt;ListBucket 
&lt;LI&gt;GetBucketAccessControlPolicy 
&lt;LI&gt;SetBucketAccessControlPolicy 
&lt;LI&gt;GetBucketLoggingStatus 
&lt;LI&gt;SetBucketLoggingStatus&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;CreateBucket&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Bucketを作成します。要素一覧は次の通り。 
&lt;P&gt;- Bucket &amp;#8230; 作成するBucket名。 
&lt;P&gt;- AccessControlList &amp;#8230; ACL。任意の要素。付与しなかった場合はフルコントロールとなります。 
&lt;UL&gt;
&lt;LI&gt;DeleteBucket&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Bucketを削除します。Bucketを削除する前にBucket内のObjectsを削除しておかないといけません。要素一覧は次の通り。 
&lt;P&gt;- Bucket &amp;#8230; 削除するBucket名。 
&lt;UL&gt;
&lt;LI&gt;ListBucket&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Objectsの一覧を取得します。Bucketsの一覧を取得するわけではありません。プリフィックス、マーカー、最大Key数を設定できます。要素一覧は次の通り。 
&lt;P&gt;- Bucket &amp;#8230; Bucket名。 
&lt;P&gt;- Prefix &amp;#8230; プリフィックス。 
&lt;P&gt;- Marker &amp;#8230; マーカー。マーカーより後のKeysしか一覧に載せません。ページングを行う場合に便利。（Prefixを&amp;#8221;N&amp;#8221;に設定し、Markerを&amp;#8221;Nev&amp;#8221;に設定すればNeedは一覧に載りませんが、NeverやNineは一覧に載るようになります） 
&lt;P&gt;- Delimiter &amp;#8230; 区切り文字。 
&lt;P&gt;- MaxKeys &amp;#8230; 最大Key数。 
&lt;UL&gt;
&lt;LI&gt;GetBucketAccessControlPolicy&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;BucketのAccessControlPolicyを取得します。BucketのオーナーやらACLの一覧やらを取得します。要素一覧は次の通り。 
&lt;P&gt;- Bucket &amp;#8230; Bucket名。 
&lt;UL&gt;
&lt;LI&gt;SetBucketAccessControlPolicy&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;BucketのAccessControlPlicyを設定します。要素一覧は次の通り。 
&lt;P&gt;- Bucket &amp;#8230; Bucket名 
&lt;P&gt;- AccessControlList &amp;#8230; ACL。 
&lt;UL&gt;
&lt;LI&gt;GetBucketLoggingStatus&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;ロギングステータスを取得します。（β機能ということで、将来的に機能が変更される可能性があります） 
&lt;P&gt;- Bucket &amp;#8230; Bucket名。 
&lt;UL&gt;
&lt;LI&gt;SetBucketLoggingStatus&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;ロギングステータスを設定します。（β機能ということで、将来的に機能が変更される可能性があります） 
&lt;P&gt;- Bucket &amp;#8230; Bucket名 
&lt;P&gt;- BucketLoggingStatus &amp;#8230; ロギングステータス 
&lt;H4&gt;Objectに対する操作 (Operations on Objects)&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;PutObjectInline 
&lt;LI&gt;PutObject 
&lt;LI&gt;GetObject 
&lt;LI&gt;GetObjectExtended 
&lt;LI&gt;DeleteObject 
&lt;LI&gt;GetObjectAccessControlPolicy 
&lt;LI&gt;SetObjectAccessControlPolicy&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;PutObjectInline&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;ObjectをBucketに加えます。同じObject（Key?）が存在している場合、常に上書きになります。このメソッドで送信できるObjectの要領は最大1MBです。ちなみにPutObjectInlineのInlineはSOAPのBodyの中にObjectのデータを書き込むことから由来しています。要素一覧は次の通り。 
&lt;P&gt;- Bucket &amp;#8230; Bucket名。 
&lt;P&gt;- Key &amp;#8230; Key名。 
&lt;P&gt;- Metadata &amp;#8230; メタデータ。Name-Valueコレクションとして複数定義可能。 
&lt;P&gt;- Data &amp;#8230; Objectのデータ。Base64で記述する必要がある。 
&lt;P&gt;- ContentLength &amp;#8230; Objectのデータ長。 
&lt;P&gt;- AccessControlList &amp;#8230; ACL。 
&lt;UL&gt;
&lt;LI&gt;PutObject&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;ObjectをBucketに加えます。PutObjectInlineのDIME Attachementバージョン。要素一覧は次の通り。 
&lt;P&gt;- Bucket &amp;#8230; Bucket名。 
&lt;P&gt;- Key &amp;#8230; Key名。 
&lt;P&gt;- Metadata &amp;#8230; メタデータ。Name-Valueコレクションとして複数定義可能。 
&lt;P&gt;- ContentLength &amp;#8230; Objectのデータ長。 
&lt;P&gt;- AccessControlList &amp;#8230; ACL。 
&lt;UL&gt;
&lt;LI&gt;GetObject &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Objectを取得します。データが要らない場合、メタデータのみを取得するようなこともできます。要素一覧は次の通り。 
&lt;P&gt;- Bucket &amp;#8230; Bucket名。 
&lt;P&gt;- Key &amp;#8230; Key名。 
&lt;P&gt;- GetMetadata &amp;#8230; メタデータを取得するかどうか。 
&lt;P&gt;- GetData &amp;#8230; データを取得するかどうか。 
&lt;P&gt;- InlineData &amp;#8230; ResponseのSOAP-Body内にデータを含むかどうか。含む場合、1MB以内のデータでないとエラーになります。 
&lt;UL&gt;
&lt;LI&gt;GetObjectExtended &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Objectを取得します。GetObjectの拡張版。GetObjectの要素に加えて次の要素があります。 
&lt;P&gt;- ByteRangeStart, ByteRangeEnd &amp;#8230; データの一部を取得する。 
&lt;P&gt;- IfModifiedSince &amp;#8230; Objectの最終更新日時が指定した日時より後だった場合、取得する。 
&lt;P&gt;- IfUnmodifiedSince &amp;#8230; Objectの最終更新日時が指定した日時より前だった場合、取得する。 
&lt;P&gt;- IfMatch &amp;#8230; ETagの値が同じ場合、取得する。複数定義可。 
&lt;P&gt;- IfNoneMatch &amp;#8230; ETagの値が一致しない場合、取得する。複数定義可。 
&lt;P&gt;- ReturnCompleteObjectOnConditionFailure &amp;#8230; ByteRangeStart/ByteRangeEndとIfUnmodifiedSince/IfMatchが同時に定義され、この要素がtrueの場合、IfUnmodifiedSince/IfMatchの判定で失敗してもエラーを返さず、Objectのデータを丸ごと返すようになります。 
&lt;UL&gt;
&lt;LI&gt;DeleteObject&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Objectを削除します。要素一覧は次の通り。 
&lt;P&gt;- Bucket &amp;#8230; Bucket名。 
&lt;P&gt;- Key &amp;#8230; Key名。 
&lt;UL&gt;
&lt;LI&gt;GetObjectAccessControlPolicy&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;ObjectのAccessControlPolicyを取得します。要素一覧は次の通り。 
&lt;P&gt;- Bucket &amp;#8230; Bucket名。 
&lt;P&gt;- Key &amp;#8230; Key名。 
&lt;UL&gt;
&lt;LI&gt;SetObjectAccessControlPolicy&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;ObjectのAccessControlPlicyを設定します。要素一覧は次の通り。 
&lt;P&gt;- Bucket &amp;#8230; Bucket名 
&lt;P&gt;- Key &amp;#8230; Key名。 
&lt;P&gt;- AccessControlList &amp;#8230; ACL。 
&lt;P&gt;これだけ見れば、開発者の方だと大体何ができるか分かると思いますが、まだまだ続きます。次はS3の認証方法について見ていこうと思います。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ganfield/aggbug/62941.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>がんふぃーるど(ganfield@wankuma.com)</dc:creator><title>Amazon Simple Storage Service (S3) その１</title><link>http://blogs.wankuma.com/ganfield/archive/2007/02/18/62902.aspx</link><pubDate>Sun, 18 Feb 2007 12:46:00 GMT</pubDate><guid>http://blogs.wankuma.com/ganfield/archive/2007/02/18/62902.aspx</guid><wfw:comment>http://blogs.wankuma.com/ganfield/comments/62902.aspx</wfw:comment><comments>http://blogs.wankuma.com/ganfield/archive/2007/02/18/62902.aspx#Feedback</comments><slash:comments>401</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ganfield/comments/commentRss/62902.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ganfield/services/trackbacks/62902.aspx</trackback:ping><description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;わんくま勉強会のビデオがオンラインになったので、2週間遅れながら、S3を試してみました。 
&lt;P&gt;まずはS3の説明から。 
&lt;P&gt;
&lt;H4&gt;S3とは&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;簡単に言ってしまうと、インターネットストレージである。 
&lt;LI&gt;ストレージにアクセスする手段としてSOAPやRESTといったインターフェースが用意されている。 
&lt;LI&gt;なんといっても高い信頼性！99.99%の信頼性を誇ります。&lt;/LI&gt;&lt;/UL&gt;&lt;STRONG&gt;費用 (pricing)&lt;/STRONG&gt; 
&lt;UL&gt;
&lt;LI&gt;0.15$ 毎GB月 のストアレージ使用料。他人が自分のストレージ領域に書き込んだものも課金されるのでACLのご利用は計画的に。 
&lt;LI&gt;0.20$ 毎GB のデータ通信料。読んでも書いても課金されます。他人がストレージの内容を読んでも課金されるのでACLのご利用は計画的に。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;注：GB月とは&amp;#8230;1GBのデータを1ヶ月間ずっと保存したことを表す単位。例えば2GBのデータを半月間、1GBのデータを1/4月間保存したら 2GB * 1/2月 + 1GB * 1/4月 = 1.25 GB月となる。 
&lt;P&gt;色んなことで課金されはするものの、元々が1GB月や1GBの通信料で20円前後しかかからないし、システムの信頼性を考慮すれば安いと考えるべきだと思う。 
&lt;H4&gt;コアコンセプト (Core Concept)&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;Objects 
&lt;LI&gt;Buckets 
&lt;LI&gt;Keys&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;おや？ Millsさんの話ではObjects/Buckets/Serviceじゃなかったっけ？わんくま勉強会で自分がメモったのにもそう書かれている&amp;#8230;ビデオはその話の部分がちょうどテープの交換で欠落している様な&amp;#8230;誰か覚えてないですかね？とりあえず、おまけでServiceの説明も入れておきました。 
&lt;UL&gt;
&lt;LI&gt;Objects&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;データ自体とメタデータを格納しているもの。メタデータは開発者が拡張することも可能。一つのObjectは5GBまで。URL参照も可能です。 
&lt;UL&gt;
&lt;LI&gt;Buckets&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;ObjectsはBucketsに格納されます。（フォルダやディレクトリの様に聞こえるが、Bucketは入れ子にできないことに注意）一つのBucketに格納できるObject数に制限はありませんが、Bucketの名前はグローバルなので、開発者が作れるBucket数は100までです。 
&lt;UL&gt;
&lt;LI&gt;Keys&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Objectに与えられる名前（識別子）のこと。Bucketの中でユニークでなければならない。例えば&lt;A href="http://s3.amazon.com/doc/2006-03-01/AmazonS3.wsdl"&gt;http://s3.amazon.com/doc/2006-03-01/AmazonS3.wsdl&lt;/A&gt;のBucketは&amp;#8221;doc&amp;#8221;で、Keyは&amp;#8221;2006-03-01/AmazonS3.wsdl&amp;#8221;となる。長さは1024B(bit?)まで（Millsさん情報） 
&lt;UL&gt;
&lt;LI&gt;Service（おまけ）&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Bucketsを格納しているもの。ルートフォルダみたいなもの。 
&lt;H4&gt;操作 (Operations)&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;Create a Bucket 
&lt;LI&gt;Write an Object 
&lt;LI&gt;Read an Object 
&lt;LI&gt;Deleting an Object 
&lt;LI&gt;Listing Keys&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;　要するに作って書いて読めて消せて一覧が取得できるということです(;&amp;#180;Д`A ``` （この他にもログ機能を操作することもできるのですが、今はまだβ版みたいです。） 
&lt;P&gt;ただ、これだけでは実際にどのような操作ができるのか分からないので、次は、SOAPのAPIを見ていきたいと思います。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ganfield/aggbug/62902.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>