C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2007/01/31 13:01
スポンサーサイト



タグ: .NET C# ASP.NET Ajax
2007/01/29 00:54
WCFでは、通信データの制限を設定できます。

[ データ量の制限 ]
WCFで用意されている各バインディングセットには、コンフィギュレーション用のセクションが用意されています。以下は代表的なバインディングセットのコンフィギュレーションセクションです。

これらのセクションのmaxReceivedMessageSize属性にて、通信データ量の制限値をバイト単位で設定できます。既定値は65536 ( 0x10000 ) バイトとなります。

また、WCFによるWebサービスでは、 [system.web] - [ httpRuntime ] セクションのmaxRequestLength属性でも通信データ量が制限されることに注意します。この属性値の単位はキロバイトで、既定値は4096 ( 0x1000 ) キロバイトとなります。
つまり、maxReceivedMessageSize属性に4194304以上の値を設定する場合、このmaxRequestLength属性も適切な値に変更する必要があります。
この属性はWCF用の属性ではなく、WCF以外のWebサービスでも有効な属性です。 ( 参考:大量データに対する戦略 )


[ 詳細な制限 ]
各バインディング用セクションの子要素である [ readerQuotas ] セクションの各属性にて、通信データの詳細な制限が設定できます。

maxArrayLength属性
SOAPメッセージで扱う配列型のデータの長さ ( 配列の要素数 ) を制限します。
既定値:16384 ( 0x4000 )

maxBytesPerRead属性
不明・・・。 ( 恐らく操作結果メッセージのサイズ制限。 )
既定値:4096 ( 0x1000 ) バイト

maxDepth属性
SOAPメッセージの、XMLノードの入れ子の深さを制限します。
既定値:32 ( 0x20 ) レベル

maxNameTableCharCount属性
不明・・・。
既定値:16384 ( 0x4000 )

maxStringContentLength属性
SOAPメッセージで扱うString型のデータの長さ ( 文字数 ) を制限します。
既定値:8192 ( 0x2000 ) 文字


[ 設定例 ]
引数でバイナリデータ ( Byte型の配列 ) を受け取る、WsHttpBindingを適用したWCF Webサービスにて、バイナリデータのサイズ制限を10MBとする場合 ( 通信データのサイズ制限は10.5MBとする ) のWeb.config設定例を以下に示します。

<system.serviceModel>
    <services>
        <service name="Service1">
            <endpoint binding="wsHttpBinding" bindingConfiguration="wsHttpBinding_IService1" contract="IService1" />
        </service>
    </services>
    <bindings>
        <wsHttpBinding>
            <binding name="wsHttpBinding_IService1" messageEncoding="Mtom" maxReceivedMessageSize="11010048">
                <readerQuatas maxArrayLength="10485760" />
            </binding>
        </wsHttpBinding>
    </bindings>
</system.serviceModel>
<system.web>
    <httpRuntime maxRequestLength="10752" />
</system.web>
タグ: .NET C# WCF
2007/01/28 03:33
疲れたー。やっとテンプレート移行作業完了です。
テンプレート選ぶのにかなり時間かかりました。半日掛けて20個くらいの新テンプレート候補を見つけて、そっから選考を行って2つまで絞ったんですが、どちらも素晴らしいデザインでかなり迷いました。最後に決め手となったのはレイアウト手法でした。
このテンプレートはDivタグ+スタイルシートでレイアウトされていたのですが、もう一つの方はTableタグでのレイアウトだったんです。 ( 前使ってたテンプレートは適当に選んだからTableタグでのレイアウトだったけど^^; )
今更言うまでもないことですが、本来Tableタグってのは表を扱うためのタグですから、レイアウトに使うのはよろしくありません。SEOを意識するならなおさらです。

それと、このテンプレートの作成者であるEnifさんという方のブログを拝見させて頂いたのですが、ものすごい親切な方なんですよ。だから「この人の作ったテンプレートを使いたい」って思いました。 ( もう一つの候補の作成者さんが親切じゃないってわけじゃないけど^^; つーかブログ見てないから人柄は不明w )


ちなみに、前のテンプレートはこちら ( ちょっと崩れるけど ) → C#と諸々 ( 旧テンプレートバージョン )
2007/01/26 18:04
WCFによるWebサービスのドキュメントタイプは、デフォルトで Document/Literal が適用されます。
ドキュメントタイプを変更するには、サービスコントラクトに対して XmlSerializerFormatAttribute クラス (System.ServiceModel) を属性として適用し、Style プロパティ ( OperationFormatStyle 列挙型 ) と Use プロパティ ( OperationFormatUse 列挙型 ) を設定してやります。オペレーションコントラクタに対して個別に適用することも可能です。

まぁ、この辺読む限り、何らかの理由がない限りはDocument/Literalのままでいいと思います。
タグ: .NET C# WCF
2007/01/25 22:49
Vistaの目玉機能の一つである「ガジェット」は、HTMLとJavaScriptによって開発できます。
開発方法に関する記事と、配布方法に関する記事のリンクを貼っておきます。

CodeZine:Windows Vistaガジェット入門(Javascript, ガジェット, Windows Vista, Windows Sidebar)
開発方法について解説されています。

Windows サイドバー ガジェットの配布について
配布方法について解説されています。
タグ: Vista Gadget
2007/01/24 11:44
ASP.NET AJAX 1.0 (正式版) リリースです。

Download details: ASP.NET AJAX 1.0
ASP.NET 2.0 AJAX Extensions と Microsoft AJAX Library が含まれます。
Visual Studio 2005へのテンプレート追加なども行われます。

AJAX Control Toolkit
CodePlexで公開されている、拡張コントロールツールキットです。多数の拡張コントロールも含まれています
拡張コントロール開発用のプロジェクトテンプレート、拡張コントロールを用いたAjax Webアプリケーション開発用のテンプレートが利用できるようになります。

AJAX : The Official Microsoft ASP.NET AJAX Site
ASP.NET AJAX の Microsoft公式サイトです。


[ 情報元 ]
ASP.NET AJAX 1.0のリリースとControl Toolkitの充実
タグ: .NET C# ASP.NET Ajax
2007/01/23 14:52

HttpCapabilitiesBase.JavaScript プロパティ

すごいなこれ^^;
まぁ、以下の部分が理由でしょうね。


ブラウザが JavaScript をサポートしていても、セキュリティの設定でスクリプトが無効になっている場合、JavaScript プロパティは true を返しますが、ブラウザでスクリプトは実行されません。

タグ: .NET C# MSDN
2007/01/20 02:56
VSUGアカデミースペシャル 「ASP.NET AJAX 1.0 登場」 ~ASP.NET 2.0によるAJAXアプリケーション構築手法~ 、行ってきました。
Ajaxについての簡単な説明から始まり、Ajaxの問題点、ASP.NET AJAXの開発目標、構成、シナリオ等について聴かせて頂き、デモンストレーションも披露して頂きました。


[ 色々と驚いた ]
今回、ASP.NET AJAXの紹介が主な内容だろうと思っていたので、あえて事前学習のようなことを全く行わずにセッションに参加しました ( いや、ちょっとは知ってたけどさ ) 。おかげで、かなり楽しめました。以下に、今回驚いたり感動した点をいくつか挙げてみます。

・VSUGって「ぶいさぐ」って読むんだ!?
すみません、知らなかったです。「ぶいえすゆーじー」だと思ってました。。。

・サーバー中心の開発モデルで、C/S間でやりとりされるデータ
サーバー中心の開発モデルというのは、「ASP.NET 2.0 AJAX Extensions」をメインに利用した開発モデルで、コーディングのほとんどがC#やVBなどのサーバーサイドコードとなります。場合によってはJavaScriptノンコーディングで行けるそうです。
サーバー中心の開発モデルでは、クライアントからサーバーへの非同期通信時に渡されるデータは、従来のポストバックと同等のデータとなるそうです。そして、サーバーからのレスポンスで渡されるデータは、UIに関するデータと動作の更新に関するJavaScriptコードとなるそうです。
これはAjax的にはオーバーヘッドと言えますね。現に、クライアント中心の開発モデル ( 「Microsoft AJAX Library」をメインに利用した開発モデル ) では、クライアントとサーバーの間で非同期にやりとりされるのは、UIや動作に関する情報を含まない純粋なデータのみとなるそうです ( ユーザーの実装方法にもよりそうだけど ) 。
でもまぁ、きちんとその辺を理解して設計・コーディングすれば、恐らくさほど問題にならないのではないでしょうか ( 少なくとも、従来の単なるポストバック方式よりパフォーマンスが落ちるということはないのでしょう、たぶん ) 。

・ASP.NET 2.0 AJAX Extensionsは、従来のASP.NET 2.0のコントロールと連携して動作する
これ、感動しました。従来のASP.NET 2.0のコントロール ( TextBoxコントロールやLabelコントロールなど ) をそのまま使えるんです。コントロールをUpdatePanelというコントロールにD&DするだけでAjax化するんです。
トリガーとなるコントロール ( ボタン等 ) は、D&DせずにUpdatePanelのTriggerプロパティで指定してやることもできるそうです。
ただ、全てのコントロールに対応しているわけではないので注意が必要です。


[ 質問タイム ]
3つほど質問が挙ってました。 ( 3つ目の質問は私です^^; )
特に興味深かったのは、2つ目の「例外ハンドリングに関して」の質問でした。ただ、この質問は後日VSUGフォーラムで回答ということになったので、楽しみにしてます。


[ 感想 ]
セッションに設けられた時間が1時間ちょいと短かったのが残念ですが、とても有益でした。
個人的には、JavaScript好きなので「Microsoft AJAX Library」も興味深々です。今回のセッションでは触れられませんでしたが、クラス, インターフェイス, 継承なども、Microsoft AJAX Libraryで考慮されているようです。
ただ実際の業務では、手軽にAjax化を実現できる「ASP.NET 2.0 AJAX Extension」の方が多用されそうですね。 ( もちろん、Microsoft AJAX Libraryでなきゃ実現できないこともあるし、ちょっと凝った事をやるにはMicrosoft AJAX Libraryが重要となるでしょう。 )
どちらにせよ、Ajaxによって画面のちらつきが取り除かれるし、従来のポストバック方式では実現できなかった機能 ( 例えばデモでも披露していた、テキスト入力補完機能など ) も実現できるようになるわけで、ASP.NET AJAXにはかなり期待してます。
タグ: .NET C# ASP.NET Ajax
2007/01/18 21:23
WCFによるWebサービスでは、バイナリデータのエンコーディング形式にBase64BinaryかMTOM ( SOAP Message Transmission Optimization Mechanism ) のどちらかを選択することができます。


[ Base64Binary と MTOM ]
Base64Binaryでは、バイナリデータを文字列へとエンコードしますが、エンコード・デコードに時間がかかる上にサイズも増加し、結果としてパフォーマンスダウンに繋がるという問題があります。
この問題を解消するために登場したのがMTOMです。MTOMを使用することで、エンコード・デコードの所要時間が短縮され、データサイズも抑えられます。


[ 設定方法 ]
WCFによるWebサービスでは、既定でBase64Binaryが使用されます。MTOMを使用する場合は、Web.configのバインディングセットの設定を次のように変更します。
WsHttpBindingの場合の設定例を以下に示します。

<system.serviceModel>
    <services>
        <service name="Service1">
            <endpoint binding="wsHttpBinding" bindingConfiguration="wsHttpBinding_IService1" contract="IService1" />
        </service>
    </services>
    <bindings>
        <wsHttpBinding>
            <binding name="wsHttpBinding_IService1" messageEncoding="Mtom" />
        </wsHttpBinding>
    </bindings>
</system.serviceModel>


[ ちなみに・・・ ]
以下の資料やページを見ると、BasicHttpBindingバインディングセットではMTOMエンコーディングを利用できないと書いてありますが、これは間違いですので注意してください。BasicHttpBindingバインディングセットでもMTOMエンコーディングを利用することは可能です。 ( 実際にSOAPメッセージを調べて確認しました。 )

[コース: C2] .NET Framework 3.0 WCF/WF アプリケーション開発 ( PowerPoint )
WCFの基本的な概念 - @IT
タグ: .NET C# WCF
2007/01/17 11:48
言わずと知れたアンダース ヘルスバーグ氏が、日本の開発者の質問に答えてくれてます。

Ask The Experts! ~ その疑問、マイクロソフトの担当者にきいてみませんか ?

特設サイトもありました。
アンダース ヘルスバーグ 特別サイト


[ 情報元 ]
Hiroyasu Kitagawa's Blog : Ask the Experts 第3弾:C#アンダース再び
タグ: .NET C#
2007/01/15 14:51
Windows PowerShell でのスクリプティング という日本語サイトがオープンしたそうです。

PowerShellはかなりの優れものなので、これを機に広く普及して欲しいところですね


[ 情報元 ]
TechNet PowerShellスクリプティングサイトがオープン ( Scripting Weblog )
PowerShell Memo - TechNetにPowerShellページ(日本語)が公開されました ( PowerShell Memo )
タグ: .NET C# PowerShell
2007/01/14 14:23
以前 Dispose Finalizeパターン という記事で解説したDispose Finalizeパターンを実装するクラスの、テンプレートを作ってみました。

【 Download 】
以下のリンクをクリックするとDownloadページへ移動するので、移動先からダウンロードしてください。

DisposableClass.zip


【 インストール方法 】
Visual Studio ユーザー項目テンプレートフォルダ ( 通常は "マイ ドキュメント\Visual Studio 2005\Templates\ItemTemplates" ) の "Visual C#" フォルダに、ダウンロードしたファイル ( DisposableClass.zip ) を配置するだけです。

Visual Studio ユーザー項目テンプレートフォルダは、Visual Studio 2005 の [ ツール ] - [ オプション ] - [ プロジェクトおよびソリューション ] - [ 全般 ] - [ Visual Studio ユーザー項目テンプレートの場所 ] で設定されている場所です。


【 使用方法 】
DisposableClass.zipをインストールすると、C#のプロジェクトに「新しい項目の追加」を行う際に "Disposable クラス" というテンプレートが選択できるようになります。

新しい項目の追加は、以下の方法で行えます。
  • [ プロジェクト ] - [ 新しい項目の追加 ] を選択する
  • プロジェクトのコンテキストメニューで [ 追加 ] - [ 新しい項目の追加 ] を選択する
  • Ctrl + Shift + A を押す
このテンプレートを使用すれば、Dispose(bool)メソッド内にリソースの解放処理を追加するだけで、Dispose Finalizeパターンを実装したことになります。


【 使用例 】
ConsoleApplication1プロジェクト ( デフォルトの名前空間もConsoleApplication1 ) で、このテンプレートを使ってDisposableClass1.csを作成した場合、以下のようなコードファイルが作成されます。

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class DisposableClass1 : IDisposable
    {
        public DisposableClass1()
        {
            this.InitializeDisposeFinalizePattern();
        }

        public void Method1()
        {
            this.ThrowExceptionIfDisposed();
            // Method1 の処理をこの位置に記述します。
        }

        #region Dispose Finalize パターン

        /// <summary>
        /// 既にDisposeメソッドが呼び出されているかどうかを表します。
        /// </summary>
        private bool disposed;

        /// <summary>
        /// ConsoleApplication1.DisposableClass1 によって使用されているすべてのリソースを解放します。
        /// </summary>
        public void Dispose()
        {
            GC.SuppressFinalize(this);
            this.Dispose(true);
        }

        /// <summary>
        /// ConsoleApplication1.DisposableClass1 クラスのインスタンスがGCに回収される時に呼び出されます。
        /// </summary>
        ~DisposableClass1()
        {
            this.Dispose(false);
        }

        /// <summary>
        /// ConsoleApplication1.DisposableClass1 によって使用されているアンマネージ リソースを解放し、オプションでマネージ リソースも解放します。
        /// </summary>
        /// <param name="disposing">マネージ リソースとアンマネージ リソースの両方を解放する場合は true。アンマネージ リソースだけを解放する場合は false。 </param>
        protected virtual void Dispose(bool disposing)
        {
            if (this.disposed)
            {
                return;
            }
            this.disposed = true;

            if (disposing)
            {
                // マネージ リソースの解放処理をこの位置に記述します。
            }
            // アンマネージ リソースの解放処理をこの位置に記述します。
        }

        /// <summary>
        /// 既にDisposeメソッドが呼び出されている場合、例外をスローします。
        /// </summary>
        /// <exception cref="System.ObjectDisposedException">既にDisposeメソッドが呼び出されています。</exception>
        protected void ThrowExceptionIfDisposed()
        {
            if (this.disposed)
            {
                throw new ObjectDisposedException(this.GetType().FullName);
            }
        }

        /// <summary>
        /// Dispose Finalize パターンに必要な初期化処理を行います。
        /// </summary>
        private void InitializeDisposeFinalizePattern()
        {
            this.disposed = false;
        }

        #endregion
    }
}



【 参考 】
独自の項目テンプレートを作成するには?[VS 2005のみ] - @IT
2007/01/14 12:17
【 主要クラス 】
メタデータの取得に用いられるクラスは、いくつかあります。これらは、アセンブリや型やメンバー ( フィールド、プロパティ、イベント、コンストラクタ、メソッド ) などに対応して用意されているので、わかりやすくなっています。

Assembly クラス (System.Reflection)
アセンブリを表します。

Module クラス (System.Reflection)
モジュールを表します。

Type クラス (System)
型を表します。型とはクラスとインターフェイスです。構造体,列挙型,デリゲートなどもクラスの一種であり、Typeクラスで表されます。

MemberInfo クラス (System.Reflection)
ク ラスのメンバ ( フィールド、プロパティ、コンストラクタ、メソッド、イベント ) を表します。このクラスは、FieldInfoクラス、PropertyInfoクラス、EventInfoクラス、 MethodBaseクラスの基本クラスです。また、Typeクラスの基本クラスでもあることに注意します。

FieldInfo クラス (System.Reflection)
フィールドを表します。

PropertyInfo クラス (System.Reflection)
プロパティを表します。

EventInfo クラス (System.Reflection)
イベントを表します。

MethodBase クラス (System.Reflection)
コンストラクタとメソッドを表します。このクラスは、ConstructorInfoクラス、MethodInfoクラスの基本クラスです。

ConstructorInfo クラス (System.Reflection)
コンストラクタを表します。

MethodInfo クラス (System.Reflection)
メソッドを表します。


それぞれの継承関係は以下のようになります。

□ System.Object
├─□ System.Reflection.Assembly
├─□ System.Reflection.Module
└─□ System.Reflection.MemberInfo
   ├─□ System.Type
   ├─□ System.Reflection.FieldInfo
   ├─□ System.Reflection.PropertyInfo
   ├─□ System.Reflection.EventInfo
   └─□ System.Reflection.MethodBase
       ├─□ System.Reflection.ConstructorInfo
       └─□ System.Reflection.MethodInfo



今回はここまでです。次回は、型情報の取得について解説します。

2007/01/10 13:47
WCFによるWebサービスを作成する際、Web.configのインテリセンスが正常に動作しません。
これはconfigurationセクションのxmlns属性に指定されているURIが不正だからです。
これを回避するためには、以下のようにxmlns属性を取り除いてやるだけです。

<!--<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">-->
<configuration>
    <!-- 中略 -->
</configuration>


これで、Web.configのインテリセンスが正常に動作します。もちろん、WCF用のセクションもバンバンとインテリセンスに現れてくれます。

# あと、Configファイルのコンテキストメニューの [ WCF Edit Configuration.. ] から、編集ツールが使えることも忘れずにw ( 上記の変更を行わなくてもちゃんと使えます。 )

[ 参考 ]
http://forums.asp.net/thread/1359525.aspx

タグ: .NET C# WCF Web.config
2007/01/09 18:30
WCFをIISでホスティングする ( WCFによるWebサービス ) 場合、IISの認証設定で、匿名アクセスを許可する必要がある。認証はWCF自身で管理する。
WCFでは、Windows 認証の他、さまざまなオプションをサポートする。その他の組み込みオプションとしては、ユーザー名トークン、X.509 証明書、SAML トークン、および InfoCard があるが、カスタムな認証メカニズムを定義することも可能。
( Windows Communication Foundation との関連における ASP.NET Web サービスの今後 からの抜粋 )


以下、とりあえず判明していることのメモ

WSHttpBinding バインディングセットを適用している場合、ServiceSecurityContext クラス (System.ServiceModel)Current静的プロパティから現在のクライアントユーザーについてのServiceSecurityContextオブジェクトが取得できる。更に、そのServiceSecurityContextオブジェクトのWindowsIdentityプロパティにて、クライアントユーザーのWindowsユーザーアカウントを表すWindowsIdentityオブジェクトが取得できる。

ServiceSecurityContext currentServiceSecurityContext = ServiceSecurityContext.Current;
WindowsIdentity currentWindowsIdentity = currentServiceSecurityContext.WindowsIdentity;



BasicHttpBinding バインディングセットを適用している場合、ServiceSecurityContextクラスのCurrent静的プロパティはNullを返す。


認証関係は苦手です ><
というか、周りに詳しい人がいるから今までまともに勉強したことがないな。
一度、しっかり基礎から学ばなければ。。。


追記 ( 2007/03/11 )
こちらの記事で、もうちょいしっかりとまとめました。
タグ: .NET C# WCF 認証