normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Windows Azure SDK for .NET 1.8 の主な更新内容&WebSocket Protocolを有効化するには?

最近のマイクロソフトは様々な製品のリリースラッシュであり、それら(特に.NET Framework 4.5 等)への Windows Azure SDK の対応が待ち望まれていたが、ついに最新版である Windows Azure SDK 1.8 がリリースされた。同SDKは以下のサイトからダウンロードが可能だ。

主な変更点

主な変更点は以下だが、他にも数点の更新がある。詳細は別途 http://msdn.microsoft.com/en-us/library/windowsazure/ff683673.aspx#BK_October2012 を参照してほしい。

  • .NET Framework 4.5, Windows Server 2012 が対象に加わった
  • サーバエクスプローラで、ストレージアカウントのリソース(ブロブの編集、アップロード。キューの作成等)を編集可能に

SDK のインストール

Web Platform Installer を立ち上げると、以下のように Windows Azure SDK for .NET 1.8 が表示されるので、利用している Visual Studio に対応した SDK を選択してインストールを実施する。

インストールが完了すると以下の画面が表示されるので、[完了]ボタンを押下すれば終了だ(Web Platform Installer は楽で良いですな)。

.NET Framework 4.5 の利用

Visual Studio を立ち上げて新規にクラウドサービスを作成する際、.NET Framework 4.5 を利用可能なことを確認できる。

また、ServiceConfiguration.Cloud.cscfg ファイルを参照すると osFamily="3" になっている。osFamily="1" が Windows Server 2008 SP1, osFamily="2" が Windows Server 2008 R2 だったので、osFamily="3" が Windows Server 2012 相当とみて間違いないだろう(まだMSDNに記載が存在しない)。

リモートデスクトップでインスタンスの情報を確認

管理ポータルから .NET Framework 4.5&Windows Server 2012 のインスタンスにリモートデスクトップをしようとしたが、管理ポータルにて以下の画面が表示された。デプロイしたクラウドサービス自体は動作しているので、管理ポータルの問題かと思われる(詳細は不明)。また、twitter の TL 上では問題なく管理ポータル上からリモートデスクトップできる方もいるので、本問題が発生しない場合はそのまま管理ポータル上からリモートデスクトップ接続を実施してほしい。

上記の問題が発生した場合は、Visual Studio のサーバエクスプローラから当該インスタンスへのリモートデスクトップ接続が可能だ。以下の画像を参考にして対応してほしい。

当該インスタンスにリモートデスクトップで接続後、IIS Manager を起動すると以下の画面が確認可能だ。Windows Server 2012 と IIS8 がクラウドサービスで稼働していることが確認できる。

しかし、「Add Roles and Features Wizard」では、ASP.NET 4.5のインストールは確認できるものの、WebSocket Protocol がインストールされていないことがわかる。

WebSocket Protocol を有効化するには?

このままではクラウドサービスにて WebSocket Protocol が利用できないため、PowerShell を利用して同機能を有効化する。PowerShell を利用した、Windows Server で機能を有効化する手順はMSDN Library > Install or Uninstall Roles, Role Services, or Featuresに記載されているが、こちらとクラウドサービスの機能であるスタートアップタスクを併用して問題を解決する。
フォルダ構成とファイルの中身はそれぞれ以下となる。

  • setup.cmd(※Shift-Jisで保存しないとエラーが発生する点に注意)
powershell.exe Install-WindowsFeature -Name Web-WebSockets
  • ServiceDefinition.csdef
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="WindowsAzure1" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2012-10.1.8">
  <WebRole name="MvcWebRole1" vmsize="ExtraSmall">
    <Startup>
      <Task commandLine="setup.cmd" taskType="simple" executionContext="elevated"/>
    </Startup>
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="Endpoint1" endpointName="Endpoint1" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="Endpoint1" protocol="http" port="80" />
    </Endpoints>
    <Imports>
      <Import moduleName="Diagnostics" />
      <Import moduleName="RemoteAccess" />
      <Import moduleName="RemoteForwarder" />
    </Imports>
  </WebRole>
</ServiceDefinition>

同対応の実施後、改めてクラウドサービスのインスタンスにリモートデスクトップで接続し、状態を確認したところ無事 WebSocket Protocol が有効化していることが確認できた。

参考リンク

すでに以下の方々が情報を記載しているので、こちらを参考にしてもよいだろう。