読者です 読者をやめる 読者になる 読者になる

レンタルサーバでWCFのホスティング

WCF

Webアプリの実験用にActiveWebレンタルサーバを借りた。

契約が12ヶ月縛りなのでちょっと不安だったけど、ASP.NET 3.5に対応しているし値段も安いので、ここに決めた。

さっそくマニュアルを見つつWebアプリをアップしてみると、ASP.NET 3.5のアプリと、Silverlightのアプリはすぐに動いた。

しかしWCFのサービスが動かない。ローカルでは動いているのに。ブラウザから.svcにアクセスしても、404のエラーが発生する。

これは、ハンドラマッピングを設定していないことが問題の模様。WCF の .svc はハンドラマッピングの追加が必要 - k_maruの思うところ2を参考にして、Web.configにSvcHandlerの設定を追加した。

<system.webServer>
  <handlers><add name="SvcHandler" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler" />
  </handlers></system.webServer>

すると404のエラーはでなくなったものの、今度は以下のようなエラーが表示される。

このコレクションには、スキーマ http を持つアドレスが既に含まれています。このコレクションでは、スキーマあたりのアドレスは 1 つ以下である必要があります。

どうやら、CreateServiceHostに渡しているアドレスがまずいらしい。

C#と諸々 WCFのホスティングを参考に、ServiceHostFactoryを作ることにする。

まず、svcファイルに以下のようにFactoryを指定する。

<%@ ServiceHost Language="C#" Service="HogeService" Factory="HogeServiceHostFactory" %>

次にServiceHostFactoryを継承したクラスを作って、CreateServiceHostをオーバーライド。アドレスを固定値で無理矢理指定してみる。

public class HogeServiceHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        ServiceHost result = base.CreateServiceHost(serviceType,
            new Uri[] { new Uri("http://zoetrope.jp/HogeService.svc")});
        return result;
    }
}

すると、WCFのサービスにアクセスできるようになったヽ(´∀` )ノ

しかし原因がよく分からない。レンタルサーバ上で動いているプログラムは、どうやってデバッグすればいいのだろう?


(2008/09/28追記)
によると、IISのバインド設定でhttpのホスト名を複数指定していることが原因のようです。

ServiceHostFactoryで無理矢理1つのアドレスを指定するよりも、ちゃんとバインド設定を変えた方がよさそうですね。

でも、レンタルサーバの場合、どこから設定できるのだろう?