こんにちは、奥田です。
かなーり以前に、「InfoPath Forms Services 匿名アクセスで投稿したい!」 というタイトルで、InfoPath Forms Services のブラウザー フォームを匿名アクセス権限でライブラリに保存するための WCF サービスの作成、公開方法をこのブログに投稿しました。SharePoint Server 2007、InfoPath 2007 のバージョンです。
昨日 SharePoint Server 2010 で同様の WCF サービスを開発したのですが、展開時にハマったポイントがあるので、ご紹介します。
以前の投稿では、WCF サービスを開発して、SharePoint サイトをホストしている IIS 上にアプリケーションとして展開する手順をご紹介しましたが、SharePoint 2010 の場合、この方法では SPWeb とか SPSite とか Microsoft.SharePoint.dll のオブジェクトを利用する際に実行時エラーとなります。
「Microsoft SharePoint は、バージョン 4.0.30319.1 の Microsoft .Net Runtime ではサポートされません。」 と PlatformNotSupportedException がでます。
SharePoint 2010 の場合、WCF サービスを展開する際には、SharePoint 上にカスタム WCF サービスとして展開しなければいけないようです。
カスタム WCF サービスの作成については、下記記事が参考となりますが、展開方法があまり詳しく書かれていなかったので、カスタム WCF サービスを展開する SharePoint プロジェクトの開発手順をご紹介したいと思います。
「MSDN :SharePoint Foundation 2010 の WCF サービス」
http://msdn.microsoft.com/ja-jp/library/ff521586.aspx
「MSDN : カスタム WCF サービスを SharePoint Foundation で作成する」
http://msdn.microsoft.com/ja-jp/library/ff521581.aspx
<手順>
1. Visual Studio 2010 で [空の SharePoint プロジェクト] を作成します。
(ISAPI 以下に WCF サービスを展開するため、ファーム ソリューションで)
2. プロジェクト内にサービス クラスファイルと、サービスコントラクトファイルを追加
サービスクラスに [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] を利用して ASP.NET 互換モードを許可するよう構成すること。
3. プロジェクト内に [SharePoint のマップされたフォルダー] で [ISAPI] フォルダーへのマップフォルダーを作成
4. [ISAPI] マップフォルダー内に、さらにフォルダーを作成し、その中に ***.svc と web.config ファイルを作成します。
5. ***.svc と web.config を開発した WCF サービスに応じて内容を編集します。
aspNetCompatibilityEnabled は true とすること。
(例)
・ ***.svc
<%@ Assembly Name=”InfoPathWcf,Version=1.0.0.0,Culture=Neutral,PublicKeyToken=4d22f097b6564138″ %>
<%@ ServiceHost Service=”InfoPathWcf.InfoPathSv” %>
・ web.config
<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
<system.web> </system.web>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled=”true” />
<services>
<service behaviorConfiguration=”InfoPathWcf.InfoPathSvBehavior” name=”InfoPathWcf.InfoPathSv”>
<endpoint address=”” binding=”basicHttpBinding” contract=”InfoPathWcf.IInfoPathSv”>
<identity><dns value=”localhost” /></identity>
</endpoint>
<endpoint address=”mex” binding=”mexHttpBinding” contract=”IMetadataExchange” />
<host>
<baseAddresses>
<add baseAddress=”http://ci:8888/” />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name=”InfoPathWcf.InfoPathSvBehavior”>
<serviceDebug includeExceptionDetailInFaults=”true”/>
<serviceMetadata httpGetEnabled=”true” />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
あとは配置なり、パッケージなりを行います。
展開すると、http://SharePoint URL/_vti_bin/(ISAPI 下のフォルダー名)/****.svc でアクセスできます。
※ 下記ブログを参考にさせていただきました。
http://answers.oreilly.com/topic/1404-how-to-customize-wcf-services-in-sharepoint-2010/
以上、奥田でした。