次の方法で共有


WCF サービスのプロキシ アセンブリを作成する

適用対象: Office 2010 | Project 2010 | Project Server 2010 | SharePoint Server 2010

Microsoft Project Server 2010 用アプリケーションの開発では、プロキシ アセンブリまたはプロキシ ソース コード ファイルを使用することによって、Windows Communication Foundation (WCF) サービスへの参照を Project Server Interface (PSI) で設定できます。Project 2010 SDK ダウンロードには、リリース版の Project Server 2010 における WCF サービスの PSI プロキシ アセンブリとプロキシ ソースが含まれています。この記事では、Project Server のサービス パックや更新向けの PSI プロキシ アセンブリの作成方法を説明します。

この記事は次のセクションで構成されます。

  • PSI プロキシ アセンブリをビルドする

    • 一般的な手順

    • クレーム認証、サービス バインド、およびエンドポイントの変更

    • 一時的な Web.config ファイルの使用

    • GenWCFProxyAssembly.cmd スクリプトの使用

前提条件

Project Server 2010 のテスト インストールを使用します。

注意

この記事の手順では、Project Server Shared Service アプリケーションの web.config ファイルを一時的に変更する必要があります。これらの手順は、Project Server 2010 のテスト インストールでのみ実行するようにしてください。

PSI プロキシ アセンブリをビルドする

PSI では ProjectServerServices.dll プロキシ アセンブリをビルドしてすべての WCF Web サービスに使用することができます。この作業には、Project 2010 SDK ダウンロードの Documentation\Intellisense\WCF フォルダーにある GenWCFProxyAssembly.cmd スクリプトを使用します。

注意

Documentation\Intellisense\WSDL フォルダーの GenASMXProxyAssembly.cmd スクリプトを使用して ProjectServerServices.dll プロキシ アセンブリを生成しても、WCF ベースのアプリケーションでは動作しません。GenASMXProxyAssembly.cmd スクリプトは、ASMX Web サービス用のソース コード ファイルを生成する wsdl.exe を呼び出します。

ASMX ベースのプロキシ アセンブリには、必要な属性やチャネル インターフェイス、また各 PSI サービス用のクライアント クラスが含まれていません。たとえば、Resource WCF サービスには、Resource ASMX Web サービスに含まれていない ResourceChannel インターフェイスと ResourceClient クラスが含まれています。

一般的な手順

GenWCFProxyAssembly.cmd スクリプトは、PSI の WCF サービス用の出力ファイルを生成し、アセンブリをコンパイルします。このスクリプトを Project Server のテスト インストールで実行するには、以下の手順に従います。

  1. バックエンド Project Service アプリケーションの web.config ファイルのコピーを [Program Files]\Microsoft Office Servers\14.0\WebServices\Shared\ProjectServer\PSI に作成します。

  2. Project 2010 SDK ダウンロードの Documentation\Intellisense\web.config.files サブディレクトリにある web.config.RTM_4RefOnly.txt ファイルをバックエンド Project Service アプリケーションのディレクトリにコピーし、その名前を「web.config」に変更します。

  3. [コマンド プロンプト] ウィンドウで、iisreset を実行します。

  4. GenWCFProxyAssembly.cmd を実行します。このスクリプトの実行後、元の web.config ファイルを復元します。

  5. もう一度 iisreset を実行します。

クレーム認証、サービス バインド、およびエンドポイントの変更

Project Server 2010 のベータ版では、クレーム ベース認証で Secure Subscriber Line (SSL) ストリーム セキュリティによる暗号化を使用していました。しかし、この暗号化は、サーバーを呼び出すたびに過剰なオーバーヘッドを必要としました。

リリースされているバージョンでは、クレーム ベース認証で ClaimsHttpFast および ClaimsHttpSecurity というカスタム バインドを使用しています。これらは暗号化も HTTPS セキュリティ バインドも使用しません。こうしたカスタム バインドは、署名されたメッセージに対するスループットを大幅に向上させます。ただし、Project Server サービス アプリケーションの Metadata Exchange (MEX) エンドポイントや、Microsoft SharePoint Server 2010 のその他のサービス アプリケーションは、署名されたメッセージを使用しません。そのため、バックエンド サービスへの参照を設定したり、https://localhost:32843/1712e91aeb884cdfb437299b89de3443/psi/project.svc のようなブラウザー URL を使用したりしようとすると、メッセージはブロックされ、サービスは次のエラーを返します。

The service encountered an error.

An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is:
System.InvalidOperationException: An exception was thrown in a call to a policy export extension.
Extension: System.ServiceModel.Channels.TransportSecurityBindingElement
Error: Security policy export failed.

リリースされているバージョンの Project Server 2010 では、web.config ファイルで定義されているサービス エンドポイントによってカスタム バインドが使用されます。たとえば、サービス参照を設定しようとすると、Project サービス用の次のバインドおよびエンドポイントは InvalidOperationException エラーを引き起こします。

<customBinding>
    <binding name="ClaimsHttpFast">
        <security authenticationMode="IssuedTokenOverTransport"
            allowInsecureTransport="true" />
    . . .
    </binding>
</customBinding>
. . .
<service
    name="Microsoft.Office.Project.Server.Wcf.Implementation.ProjectImpl"
    behaviorConfiguration="ProjectServerBehavior" >
    . . .
    <endpoint
      address=""
      binding="customBinding"
      behaviorConfiguration="ProjectServerEndpointBehavior"
      bindingConfiguration="ClaimsHttpFast"
      contract="Microsoft.Office.Project.Server.Interfaces.IProject" />
    <endpoint
</service>

一時的な Web.config ファイルの使用

web.config.RTM_4RefOnly.txt ファイルでは、サービスが basicHttpBinding 要素の子である ClaimsHttpSecurity と ClaimsHttpFast を使用します。customBinding 要素全体はコメント アウトされています。それぞれのサービス エンドポイントは、customBinding 要素ではなく basicHttpBinding 要素を使用します。これらの変更により、エラーを発生させることなく Visual Studio でサービス参照を直接設定できます。

以下に、web.config.RTM_4RefOnly.txt ファイルの bindings 要素全体を示します。

<bindings>
  <basicHttpBinding>
    <binding name="mexHttpBinding">
      <security mode="None">
      </security>
    </binding>
    <binding name="ClaimsHttpSecurity">
      <security mode="None" >
      </security>
    </binding>
    <binding name="ClaimsHttpFast">
      <security mode="None">
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

以下に、Project サービス用の service 要素の全体を示します。ClaimsHttpSecurity および ClaimsHttpFast のエンドポイントは、customBinding 要素の代わりに basicHttpBinding 要素を使用しています。

<service
  name="Microsoft.Office.Project.Server.Wcf.Implementation.ProjectImpl"
  behaviorConfiguration="ProjectServerBehavior" >
  <endpoint
    address="secure"
    binding="basicHttpBinding"
    bindingConfiguration="ClaimsHttpSecurity"
    behaviorConfiguration="ProjectServerEndpointBehavior"
    contract="Microsoft.Office.Project.Server.Interfaces.IProject" />
  <endpoint
    address=""
    binding="basicHttpBinding"
    behaviorConfiguration="ProjectServerEndpointBehavior"
    bindingConfiguration="ClaimsHttpFast"
    contract="Microsoft.Office.Project.Server.Interfaces.IProject" />
  <endpoint
    address="mex"
    binding="basicHttpBinding"
    bindingConfiguration="mexHttpBinding"
    name="mex"
    contract="IMetadataExchange" />
</service>

これまでの説明に従ってバックエンド Project Service アプリケーションの一時的な web.config ファイルを作成することもできますが、手動での編集によってエラーが混入する可能性があります。前述のクレーム エンドポイントの双方に対するバインド定義は、あらゆるサービスに対応するように変更する必要があります。SDK ダウンロードの web.config.RTM_4RefOnly.txt ファイルをコピーして一時的な web.config ファイルとして使用することをお勧めします。

GenWCFProxyAssembly.cmd スクリプトの使用

以下に、SDK ダウンロードの Documentation\Intellisense\WCF フォルダーにある GenWCFProxyAssembly.cmd スクリプトの内容を示します。wsdl.exe は、どれも同じバージョンなので任意の場所にあるものを使用できます。

このスクリプトを使用する前に、Project Server Service アプリケーション ディレクトリの GUID 名を変更します。

@echo off
@ECHO ------------------------------------------------------
@ECHO Creating the C# files for the WCF-based proxy assembly
@ECHO ------------------------------------------------------

REM ** Replace ServerName with the name of the server and 
REM    the instance name of Project Web App. Do not use localhost.
(set VDIR1=https://ServerName/ProjectServerName/_vti_bin/PSI)

REM ** Replace the GUID for your Project Server Service virtual directory name. **
(set VDIR2=https://localhost:32843/1712e91aeb884cdfb437299b89de3443/PSI)

(set OUTDIR=.\Source)

REM ** Wsdl.exe is the same version in the v6.0A and v7.0A subdirectories. 
(set WSDL="C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bin\x64\wsdl.exe")

if not exist %OUTDIR% (
    md %OUTDIR%
)

REM Use the back-end Project Service application URL for the WCF services.
REM ** The following command is all on one line.

for /F %%i in (Classlist_WCF.txt) do svcutil.exe /tcv:Version35 /serializer:XmlSerializer 
    /nologo /t:code /l:CS /n:*,WebSvc%%i /d:.\Source /o:wcf.%%i.cs %VDIR2%/%%i.svc

REM Use the front-end Project Web App URL for the LoginForms and LoginWindows services.

%WSDL% /nologo /l:CS /namespace:WebSvcLoginForms /out:%OUTDIR%\wsdl.LoginForms.cs %VDIR1%/LoginForms.asmx 
%WSDL% /nologo /l:CS /namespace:WebSvcLoginWindows /out:%OUTDIR%\wsdl.LoginWindows.cs %VDIR1%/LoginWindows.asmx

@ECHO ----------------------------
@ECHO Compiling the proxy assembly
@ECHO ----------------------------

(set SOURCE=%OUTDIR%\)
(set CSC=%WINDIR%\Microsoft.NET\Framework\v3.5\csc.exe)
(set ASSEMBLY_NAME=ProjectServerServices.dll)

%CSC% /t:library /out:%ASSEMBLY_NAME% %SOURCE%*.cs

このスクリプトでは Classlist_wcf.txt ファイルを使用しています。このファイルには、サードパーティの開発者が使用できる PSI サービスの一覧が含まれています。

Admin
Archive
Calendar
CubeAdmin
CustomFields
Driver
Events
LookupTable
Notifications
ObjectLinkProvider
PortfolioAnalyses
Project
QueueSystem
ResourcePlan
Resource
Security
Statusing
TimeSheet
Workflow
WssInterop

作成される任意の名前空間は ASMX Web サービスと WCF サービスで同じものなので、Intellisense 用の ProjectServerServices.xml ファイルはどちらのバージョンにも使用できます。たとえば、Resource サービスの名前空間は WCF ベース プロキシ アセンブリでも ASMX ベース プロキシ アセンブリでも SvcResource です。当然ですが、GenWCFProxyAssembly.cmd スクリプトにある SvcUtil.exe コマンドの \n パラメーター内の名前空間の名前を変更することもできます。ただし、その名前はプロキシ アセンブリと ProjectServerServices.xml ファイルで一致する必要があります。

関連項目

概念

WCF と PSI の概要

WCF ベースのコード サンプルの前提条件

ASMX ベースのコード サンプルの前提条件