仮面's profile宇宙仮面の C# 研究室.Live SpacePhotosBlogListsMore Tools Help

Blog


    May 18

    XML Web Service の呼び出し

    CPUの温度を取得する際、WebClient を使用した、非同期呼び出し。

    なお、Silverlight 3 Beta では、linq がサポートされていないので動かない。

    ///////////

    WebClient client = new WebClient();

    string request = "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"  xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">  <soap:Body><CPUTemperatureStringResponse xmlns=\"http://tempuri.org/\">      <CPUTemperatureStringResult>float</CPUTemperatureStringResult>    </CPUTemperatureStringResponse></soap:Body></soap:Envelope>";

    client.Headers.Add(HttpRequestHeader.ContentType, "text/xml");

    client.Headers.Add("SOAPAction", "http://tempuri.org/CPUTemperature");

    client.UploadStringCompleted += delegate(Object sender2, UploadStringCompletedEventArgs ev)
    {
        XNamespace soap="http://schemas.xmlsoap.org/soap/envelope/";
        XNamespace xsi="http://www.w3.org/2001/XMLSchema-instance";
        XNamespace xsd="http://www.w3.org/2001/XMLSchema";
        XNamespace xst = "http://tempuri.org/";

        XDocument xmlHeadlines = XDocument.Parse(ev.Result);
        var headlines = from story in xmlHeadlines.Descendants(xst + "CPUTemperatureResult") select story;

        string temp = headlines.First().Value;

        TextBox1.Text = temp;
    };

    client.UploadStringAsync(new Uri("http://localhost/SystemTemperature/Temperature.asmx"), request);

    May 06

    CPUの温度取得に関するメモ6

    WinRing0 を利用した Web Service のビルド環境の構築まとめ (Vista 32bit版)

    1. Visual Studio 2008 を管理者モードで起動
    2. ASP.NET Web サービスアプリケーションのプロジェクトを作成
    3. OpenLibSys.cs を追加
    4. WinRing0 は管理者で実行する必要があるため、Web.Config で Administrator に偽装するためのコードを追加
      <configuration>
        <system.web>
          <identity impersonate="true" userName="ホスト名\Administrator" password="パスワード" />
    5. デバッグ環境時の DLL 参照パス C:\Program Files\Common Files\Microsoft Shared\DevServer\9.0 に WinRing0.sys と WinRing0.dll をコピーする。
    6. IIS実行環境時の DLL 参照パス c:\windows\system32\inetsrv に WinRing0.sys と WinRing0.dll をコピーする。

    CPUの温度取得に関するメモ5

    Web Service から OpenLibSys を呼び出すと、InitializeOls(); を呼ぶところでOLS_DLL_DRIVER_NOT_FOUND エラーになってしまう。

    この原因は、WinRing0.sys を Visual Studio のデバッグ環境で、Web Service から呼び出すときに、OlsDll.cpp の Initialize()関数の中で、ドライバーを呼び出すときのパスが、 “C:\Program Files\Common Files\Microsoft Shared\DevServer\9.0\WinRing0.sys” になってしまうためであることが判明した。暫定で、その場所に WinRing0.sys をコピーして先に進んでみる。

    次に、Web Service をローカルの IIS に発行してみると、ドライバーを呼び出すときのパスが今度は、 “c:\windows\system32\inetsrv\WinRing0.sys” になってしまい、ドライバーを探しに行ってエラーになってしまう。そこに、WinRing0.sys をコピーすることで、Web Service から OpenLibSys を呼び出せるようになった。

    image 

    はまったメモ:

    WinRing0が LoadLibrary で呼ばれていて、Web Service からデバッグできないので、ビルド環境を作って、メッセージを埋め込んでデバッグするしかなかった。もう少しいい方法があるのかな・・・

    そこで、WinRin0\dll をビルドしてたら、DEF ファイルが外出しになっていて、リンカオプションに def ファイルを追加する必要があった。

    /DEF:"C:\Users\uchukamen\Desktop\WinRing0_1_3_0\source\dll\OlsApi.def"

    そこで、fprintf (stderr でと思ったが、出力先がないので、エラーを出せない。イベントログも面倒なので、とりあえず、ファイルにエラーメッセージを書き出した。

    やっぱりワナがあった w

    ここまでくれば、あとは OpenLibSys も気にせず、管理者モードに移行する必要もなく、簡単にアプリができる。ただ、OpenLibSys 強力な分、セキュリティ上注意が必要。

    ASP.NET で偽装する

    温度計を Web Service にしてなんてことを考えて、Administrator 権限が必要な OpenLibSys を Web Service 化するには、偽装しなければならない。その他、きっとはまるだろうと思いつつ、やっぱり引っかかりますね。

    Web.config で

    <configuration>
      <system.web>
        <identity impersonate="true" userName="ホスト名\Administrator" password="パスワード" />
       …

    と追加して、実行すると、

    '/' アプリケーションでサーバー エラーが発生しました。 構成にエラーがあります。

    説明: この要求を処理するために必要な構成ファイルの処理中にエラーが発生しました。以下のエラーの詳細を確認し、構成ファイルに変更を加えてください。
    パーサー エラー メッセージ: 構成ファイルで指定された資格情報から Windows ユーザー トークンを作成できません。オペレーティング システム 'ログオン失敗: アカウントは現在無効に設定されています。
    ' のエラーです。

    というエラーが発生。Vista では、Administrator アカウントが無効になっているので、

    [管理ツール] → [ローカル セキュリティ ポリシー]

    image

    これを有効にしてみた。すると、このエラーは、無事解決。

    しかし、InitializeOls(); を呼ぶところで引っかかっている。サービス側なので、デバッグが厄介だな・・・

    この原因は、WinRing0.sys を Visual Studio のデバッグ環境で、Web Service から呼び出すときに、OlsDll.cpp の Initialize()関数の中で、ドライバーを呼び出すときにディレクトリが、 “C:\Program Files\Common Files\Microsoft Shared\DevServer\9.0\WinRing0.sys” になってしまい、OLS_DLL_DRIVER_NOT_FOUND エラーになってしまう。暫定で、その場所に WinRing0.sys をコピーして先に進んでみる。

    次に、Web Service をローカルの IIS に発行してみると、こんどは “c:\windows\system32\inetsrv\WinRing0.sys” を探しに行ってエラーになる。そこに、WinRing0.sys をコピーすることで、Web Service から OpenLibSys を呼び出せるようになった。

    May 05

    あれ? Vista IIS 7 で Web Service が動かない・・・

    温度計をWeb Serviceにしてしまおうかと思って、久々にWeb Service を作って、ローカルの Vista に発行してみたら、

    「IIS 7.0 でホストされている Web サイトにアクセスすると、エラー メッセージ:"HTTP エラー 500.19-内部サーバー エラー"」 というエラーで Web Service が動かない。

    http://support.microsoft.com/kb/942055/ja

    に対処方法が書かれていたので、その通りにしてみたが症状は変わらず。

    あれれ? ということで、いろいろ調べていたら、[コントロール パネル] → [プログラムと機能] → [Windows の機能を有効化または無効化] → [アプリケーション開発機能] の ASP.NET のチェックがされていなかった。

    VISTA を入れて、Visual Studio 2008 を標準インストールしただけで特に何もしていないはずなので、標準インストールでは ASP.NETは ON にならないのかな?

    image

    このチェックを入れたら、無事動いた。

    Windows Vista IIS で ASP.NET を動かすための設定は、

    http://msdn.microsoft.com/ja-jp/library/aa964620.aspx

    に書かれています。
    エラーメッセージからサポートオンラインの情報を引いたのだけれど、その情報に惑わされてしまった。というわけで、またはまりそうなので、一応メモっておこう。
    January 26

    ASP.NET ルーティング 続き on 2003 Server

    この前の ASP.NET ルーティングは、VS2008 + Vista ASP.NET開発サーバーであっさり動きました。

    ところが、2003 Server で試してみると動かない。

    ???ということで調べてみると、

    IIS の Web サイトのプロパティ → ホームディレクトリ タブ → 構成ボタンを押し下げます。

    image

    すると、アプリケーションの構成ダイアログが表示されます。

    image 

    ここで、ワイルドカード アプリケーション マップで、挿入ボンタンを押す。

    image

    c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll を指定し、

    ファイルの存在を確認する チェックボックスを外す。

    これにより該当しないファイル拡張子の場合、aspnet_isapi.dll で、ルーティングが追加されていないかどうか確認するようになりました。

    August 25

    HTML の圧縮

    TechEd 2007 でのセッションで、どのセッションか忘れてしまったが、HTMLのサイズを圧縮し、高速化するヒントとして2つ紹介されていた。WZero3のメモ帳にメモってあるだけで忘れそうなので、メモ。
     
    1. Visual Studio で[ツール]→[オプション]→[HTML]で、デフォルトでは[空白の挿入]になっているので、空白が多い場合にはページのサイズが大きくなってしまう。これを[タブの保持]にする。場合によってはサイズが 1/3 ぐらいになる。
    2. IISで、HTTP 1.1 圧縮を使う。
      http://www.port80software.com/ で、どの程度圧縮されているのか、確認することができる。
      とあるページを試しにやってみたら、圧縮により サイズが 1/5  になる。
    October 01

    Login.aspx がエラーになる

    次のエラーになった場合、ファイル名とクラス名がかぶっている
    ことが原因のようだ。

    Source Error:

    Line 118: public login_aspx() {
    Line 119: string[] dependencies;
    Line 120: ((Login)(this)).AppRelativeVirtualPath = "~/Login.aspx";
    Line 121: if ((global::ASP.login_aspx.@__initialized == false)) {
    Line 122: dependencies = new string[3];


    Source File: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary
    ASP.NET Files
    oot\23c2a77e\aa6cf731\App_Web_login.aspx.cdcab7d2.iei5x67s.0.cs Line: 120

    http://geekswithblogs.net/azamsharp/archive/2006/05/31/80286.aspx

    Login.aspx のファイル名をリネームするだけでは
    クラス名はそのままなのでだめです。
    Login.aspxのファイルを削除して別名で作成するか、
    クラス名を変更する必要があります。

    ASP.NET で Shift-JIS エンコードを使う

    ASP.NET ではデフォルトで Unicode。
    Shift-JISを使うには、Web.config で




    requestEncoding="Shift-JIS"
    responseEncoding="Shift-JIS"
    />


    で Shift-JIS を指定する。