IIS + WebServiceを使った簡単なサンプルアプリ開発

今回は簡単にサーバーの現在時間を返すだけのWebServiceをJSON形式で返すものを作りたいと思います。

# 開発環境
- Windows7
- VisualStudio 2015
- インターネットインフォーメーションサービス7（以下IIS）
- WebService

# 準備
とりあえず準備しよう
## IISの環境を準備
**Windows7の場合**
1. IISを有効化
　1. コントロールパネル
　2. プログラムのアンインストール
　3. 左のメニューから「Windowsの機能の有効化または無効化
　4. インターネットインフォーメーションサービスのチェックボックスをオン
　5. OK
2. IISを開いてみる
　1. Windowsキー + Rを押下しファイルを指定して検索ウィンドウを表示
　2. 「inetmgr」と入力してOK

これで開ければとりあえずIISの使用準備は完了！

## VisualStudio 2015の準備
~~どっか適当に見てやってね★~~
ちなみにVS2015の準備に４時間かかりました（インストール長杉）

# WebServiceを作ろう
VisualStudio 2015から新規プロジェクトを作成
テンプレートはとりあえず「ASP.NET Web アプリケーション」でおk
作成後ソリューションエクスプローラからプロジェクト名を右クリックで「新しい項目を追加」
「Webサービス(ASMX)」を探し出し追加
すると初期状態で下記のようなファイルが書き出されるはず。

```csharp:SampleWS.asmx.cs
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
 
/// <summary>
/// SampleWSの概要の説明です
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// この Web サービスを、スクリプトから ASP.NET AJAX をしようして呼び出せるようにするには、次の行のコメントを解除します。
// [System.Web.Script.Services.ScriptService]
public class SampleWS : System.Web.Services.WebService
{
    [WebMethod]
    public string HelloWorld() {
        return "Hello World";
    }
    
}
```
この状態で既にHelloWorldと出力は出来ますがそれだとしょうもないので少しだけコードを追加！
下記のコードに書き換えちゃいましょう。

```csharp:SampleWS.asmx.cs
using System;
using System.Web;
using System.Web.Script.Serialization;
using System.Web.Script.Services;
using System.Web.Services;
using System.Web.Services.Protocols;

public class ServerTime
{
    public string datetime { get; set; }
}
 
/// <summary>
/// SampleWSの概要の説明です
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// この Web サービスを、スクリプトから ASP.NET AJAX をしようして呼び出せるようにするには、次の行のコメントを解除します。
// [System.Web.Script.Services.ScriptService]
public class SampleWS : System.Web.Services.WebService
{
    [WebMethod]
    public string HelloWorld() {
        return "Hello World";
    }

    [WebMethod(Description="サーバーの現在時刻を返します。")]
    [ScriptMethod(UseHttpGet =true, ResponseFormat =ResponseFormat.Json)]
    public void getServerTime() {
        JavaScriptSerializer js = new JavaScriptSerializer();
        Context.Response.Clear();
        Context.Response.ContentType = "application/json";
        ServerTime st = new ServerTime();
        st.datetime = DateTime.Now.ToLongTimeString();
        Context.Response.Write(js.Serialize(st));
    }
    
}
```
# IISへWebServiceを配置しよう
先ほど作成したWebServiceをIISへ配置していきたいと思います。
## 発行
まずあらかじめ発行先のフォルダを作成しておきます。
どこでも大丈夫です。きっと。
ソリューションエクスプローラーからプロジェクトを右クリックで「公開」
発行先の選択は「カスタム」を選択し適当なプロファイル名を入力
Publish methodは「File System」を選択
Target locationは先程作成した発行先のフォルダを指定
あとはとくに触らず発行すれば自動的に指定してフォルダにファイルが吐き出されます。
それではこいつらを料理していきましょう:fork_and_knife:
## フォルダのアクセス権設定
これをしないとIISへ接続できま１０
発行先フォルダに対してセキュリティ設定をします。
大雑把に書きます。
- IUSR
- IIS_IUSRS
- IIS AppPool\DefaultAppPool
を読み取り権限つけて追加します。書き込み権限はもしいるならどうぞ。
## IIS側の準備
またIISマネージャー開きます
Windowsキー + Rを押下しファイルを指定して検索ウィンドウを表示
「inetmgr」と入力してOK
左側に表示されているツリーの一番上のやつ右クリックで「Webサイトの追加」
- サイト名
　なんでも好きなの。
　入力後アプリケーションプールも一緒に変わっちゃうので
　DefaultAppPoolに戻しておくといい
- 物理パス
　先程発行先フォルダとして作成したフォルダを指定
- 種類
　とりあえずhttpで大丈夫です。
- IPアドレス
　とりあえず192.168.xx.xxに変更しましょうね
- ポート
　ポートも変更しなくてOKです。
- ホスト名
　未入力でOKです。
# 接続確認
まずは接続できるかどうか。
ブラウザで`http://192.168.xx.xx/SampleWS.asmx`に接続
xx.xxは自身のIPアドレスに置き換えてください。localhostでも可。
これでとりあえず繋がればOKです。
自分からは見れるのに他PCから見れないよ〜！という場合
ファイアーウォールが邪魔をしている可能性があるので・・・
下記サイトを参考にWorld Wide Web サービス （HTTP トラフィック）を有効化しよう！
参考サイト：https://creativeweb.jp/tips/firewall/
次に先程作ったサーバーの時間を返すWebServiceの確認。。。
同じように`http://192.168.xx.xx/SampleWS.asmx/getServerTime`とやるだけ。
するとJSON形式でサーバーの時間が返ってくるはず・・・？