Wcf-was-hosting

提供:Dev Guides
移動先:案内検索

WCF-WASホスティング

WASホスティングの概念を理解するには、システムの構成方法とサービスコントラクトの作成方法を理解し、ホストされたサービスへのさまざまなバインディングを有効にする必要があります。

まず、非プロトコルに対してWCFを有効にします。 サービスの作成を開始する前に、WASをサポートするようにシステムを構成する必要があります。 WASを構成する手順は次のとおりです-

  • [スタート]メニュー→[コントロールパネル]→[プログラムと機能]を​​クリックし、左側のウィンドウで[Windowsコンポーネントの有効化または無効化]をクリックします。
  • 「Microsoft .Net Framework 3.0」を展開し、「Windows Communication Foundation HTTPアクティベーション」と「Windows Communication Foundation非HTTPアクティベーション」を有効にします。
  • 次に、BindingをデフォルトのWebサイトに追加する必要があります。 例として、デフォルトのWebサイトをTCPプロトコルにバインドします。 [スタート]メニュー→[プログラム]→[アクセサリ]に移動します。 [コマンドプロンプト]を右クリックし、コンテキストメニューから[管理者として実行]を選択します。
  • 次のコマンドを実行します-
C:\Windows\system32\inetsrv> appcmd.exe set site "Default Web Site" -+bindings.[protocol='net.tcp',bindingInformation='808:*']

このコマンドは、「C:\ Windows \ system32 \ inetsrv \ config」ディレクトリにあるapplicationHost.configファイルを変更することにより、デフォルトのWebサイトにnet.tcpサイトバインディングを追加します。 同様に、デフォルトのWebサイトに異なるプロトコルを追加できます。

WASホストサービスを作成する

  • ステップ-1 *-Visual Studio 2008を開き、[新規]→[WebSite]をクリックし、テンプレートから[WCFサービス]を選択し、以下に示すようにHTTPとして[場所]を選択します-

Wcf Hosting Services WAS 1

  • ステップ-2 *-インターフェースIMathServiceを作成して契約を作成します。 ServiceContract属性をインターフェイスに追加し、OperationContract属性をメソッド宣言に追加します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

//NOTE: You can use the "Rename" command on the "Refactor" menu to
//change the interface name "IService" in both code and config file
//together.

[ServiceContract]

Public interface IMathService {
   [OperationContract]
   int Add(int num1, int num2);

   [OperationContract]
   int Subtract(int num1, int num2);
}
  • ステップ-3 *-IMathServiceインターフェースの実装を以下に示します-
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

//NOTE: You can use the "Rename" command on the "Refactor" menu to
//change the class name "Service" in code, svc and config file
//together.

Public class MathService : IMathService {
   Public int Add(int num1, int num2) {
      return num1 + num2;
   }
   Public int Subtract(int num1, int num2) {
      return num1 - num2;
   }
}
  • ステップ-4 *-サービスファイルを以下に示します。

Wcf Hosting Services WAS 2

<%@ServiceHostLanguage="C#"Debug="true"Service="MathService"CodeBehind="~/App_Code/MathService.cs"%>
  • ステップ-5 *-web.Configファイルで、「netTcpBinding」バインディングを使用してエンドポイントを作成します。サービスメタデータは、メタデータ交換ポイントを使用して公開されます。 そのため、アドレスを「mex」、バインディングを「mexTcpBinding」としてメタデータ交換エンドポイントを作成します。 サービスのメタデータを公開しないと、たとえば、net.tcpアドレスを使用してプロキシを作成できません-
svcutil.exe net.tcp://localhost/WASHostedService/MathService.svc).
<?xml version = "1.0" ?>
<configuration>
   <!--
      Note: As an alternative to hand editing this file you can use the
         web admin tool to configure settings for your application. Use
         the Website->Asp.Net Configuration option in Visual Studio.
         A full list of settings and comments can be found in
         machine.config.comments usually located in
         \Windows\Microsoft.Net\Framework\vx.x\Config
   -->
   <configSections>
      <sectionGroup name = "system.web.extensions"
         type = "System.Web.Configuration.SystemWebExtensionsSectionGroup,
         System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,
         PublicKeyToken = 31BF3856AD364E35">

         <sectionGroup name = "scripting"
            type = "System.Web.Configuration.ScriptingSectionGroup,
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,
            PublicKeyToken =3 1BF3856AD364E35">

            <section name = "scriptResourceHandler"
               type = "System.Web.Configuration.ScriptingScriptResourceHandlerSection,
               System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,
               PublicKeyToken = 31BF3856AD364E35"
               requirePermission = "false"
               allowDefinition = "MachineToApplication"/>

            <sectionGroup name = "webServices"
               type = "System.Web.Configuration.ScriptingWebServicesSectionGroup,
               System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,
               PublicKeyToken = 31BF3856AD364E35">

               <section name = "jsonSerialization"
                  type = "System.Web.Configuration.ScriptingJsonSerializationSection,
                  System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,
                  PublicKeyToken = 31BF3856AD364E35" requirePermission = "false"
                  allowDefinition = "Everywhere"/>

               <section name = "profileService"
                  type = "System.Web.Configuration.ScriptingProfileServiceSection,
                  System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,
                  PublicKeyToken = 31BF3856AD364E35" requirePermission = "false"
                  allowDefinition = "MachineToApplication"/>

               <section name = "authenticationService"
                  type = "System.Web.Configuration.ScriptingAuthenticationServiceSection,
                  System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,
                  PublicKeyToken = 31BF3856AD364E35" requirePermission = "false"
                  allowDefinition = "MachineToApplication"/>

               <section name = "roleService"
                  type = "System.Web.Configuration.ScriptingRoleServiceSection,
                  System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,
                  PublicKeyToken = 31BF3856AD364E35" requirePermission = "false"
                  allowDefinition = "MachineToApplication"/>

            </sectionGroup>
         </sectionGroup>
      </sectionGroup>
   </configSections>

   <appSettings/>
   <connectionStrings/>

   <system.web>
      <!--
         Set compilation debug="true" to insert debugging
         symbols into the compiled page. Because this
         affects performance, set this value to true only
         during development.
      -->
      <compilation debug = "true">
         <assemblies>
            <add assembly = "System.Core, Version = 3.5.0.0,
               Culture = neutral, PublicKeyToken = B77A5C561934E089"/>

            <add assembly = "System.Web.Extensions, Version = 3.5.0.0,
               Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/>

            <add assembly = "System.Data.DataSetExtensions,
               Version = 3.5.0.0, Culture = neutral,
               PublicKeyToken = B77A5C561934E089"/>

            <add assembly = "System.Web.Extensions, Version = 3.5.0.0,
               Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/>

            <add assembly = "System.Xml.Linq,
               Version = 3.5.0.0, Culture = neutral,
               PublicKeyToken = B77A5C561934E089"/>
         </assemblies>
      </compilation>

      <!--
         The <authentication> section enables configuration
         of the security authentication mode used by
         ASP.NET to identify an incoming user.
      -->

      <authentication mode="Windows"/>

      <!--
         The <customErrors> section enables configuration
         of what to do if/when an unhandled error occurs
         during the execution of a request. Specifically,
         it enables developers to configure html error pages
         to be displayed in place of a error stack trace.
         <customErrors mode = "RemoteOnly" defaultRedirect = "GenericErrorPage">
         <error statusCode = "403" redirect = "NoAccess"/>
         <error statusCode = "404" redirect = "FileNotFound"/>
         </customErrors>
      -->

      <pages>
         <controls>
            <add tagPrefix = "asp" namespace = "System.Web.UI"
               assembly = "System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,
               PublicKeyToken = 31BF3856AD364E35"/>

            <add tagPrefix = "asp" namespace = "System.Web.UI.WebControls"
               assembly = "System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,
               PublicKeyToken = 31BF3856AD364E35"/>
         </controls>
      </pages>

      <httpHandlers>
         <remove verb = "*" path = "*.asmx"/>

         <add verb =" *" path =" *.asmx" validate="false"
            type = "System.Web.Script.Services.ScriptHandlerFactory,
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,
            PublicKeyToken = 31BF3856AD364E35"/>

         <add verb = "*" path = "*_AppService.axd" validate = "false"
            type = "System.Web.Script.Services.ScriptHandlerFactory,System.Web.Extensions,
            Version = 3.5.0.0, Culture = neutral,
            PublicKeyToken = 31BF3856AD364E35"/>

         <add verb = "GET,HEAD" path = "ScriptResource.axd"
            type = "System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions,
            Version = 3.5.0.0, Culture = neutral,
            PublicKeyToken = 31BF3856AD364E35" validate = "false"/>
      </httpHandlers>

      <httpModules>
         <add name = "ScriptModule"
            type = "System.Web.Handlers.ScriptModule,
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,
            PublicKeyToken = 31BF3856AD364E35"/>
      </httpModules>

   </system.web>

   <system.codedom>
      <compilers>

         <compiler language = "c#;cs;csharp" extension = ".cs" warningLevel = "4"
            type = "Microsoft.CSharp.CSharpCodeProvider, System,
            Version = 2.0.0.0, Culture = neutral,
            PublicKeyToken = b77a5c561934e089">

            <providerOption name = "CompilerVersion" value = "v3.5"/>
            <providerOption name = "WarnAsError" value = "false"/>
         </compiler>

         <compiler language = "vb;vbs;visualbasic;vbscript"
            extension = ".vb" warningLevel = "4"
            type = "Microsoft.VisualBasic.VBCodeProvider, System,
            Version = 2.0.0.0, Culture = neutral,
            PublicKeyToken = b77a5c561934e089">

            <providerOption name = "CompilerVersion" value = "v3.5"/>
            <providerOption name = "OptionInfer" value = "true"/>
            <providerOption name = "WarnAsError" value = "false"/>
         </compiler>

      </compilers>
   </system.codedom>

   <!--
      The system.webServer section is required for running ASP.NET AJAX under
      Internet Information Services 7.0. It is not necessary for previous version of IIS.
   -->

   <system.webServer>
      <validation validateIntegratedModeConfiguration = "false"/>

      <modules>
         <remove name = "ScriptModule"/>
         <add name = "ScriptModule" preCondition = "managedHandler"
            type = "System.Web.Handlers.ScriptModule, System.Web.Extensions,
            Version = 3.5.0.0, Culture = neutral,
            PublicKeyToken = 31BF3856AD364E35"/>
      </modules>

      <handlers>
         <remove name = "WebServiceHandlerFactory-Integrated"/>
         <remove name = "ScriptHandlerFactory"/>
         <remove name = "ScriptHandlerFactoryAppServices"/>
         <remove name = "ScriptResource"/>

         <add name = "ScriptHandlerFactory"
            verb = "*" path = "*.asmx" preCondition = "integratedMode"
            type = "System.Web.Script.Services.ScriptHandlerFactory,
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,
            PublicKeyToken = 31BF3856AD364E35"/>

         <add name = "ScriptHandlerFactoryAppServices"
            verb = "*" path = "*_AppService.axd" preCondition = "integratedMode"
            type = "System.Web.Script.Services.ScriptHandlerFactory,
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,
            PublicKeyToken = 31BF3856AD364E35"/>

         <add name = "ScriptResource" preCondition = "integratedMode"
            verb = "GET,HEAD" path = "ScriptResource.axd"
            type = "System.Web.Handlers.ScriptResourceHandler,
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,
            PublicKeyToken = 31BF3856AD364E35"/>

      </handlers>
      <!--
         To browse web app root directory during debugging, set the value below to true.
         Set to false before deployment to avoid disclosing web app folder information.
      -->
      <directoryBrowse enabled="true"/>
   </system.webServer>

   <runtime>
      <assemblyBinding appliesTo = "v2.0.05727" xmlns = "urn:schemas-microsoft-com:asm.v1">

         <dependentAssembly>
            <assemblyIdentity name = "System.Web.Extensions" publicKeyToken = "31bf3856ad364e35"/>
            <bindingRedirect oldVersion = "1.0.0.0-1.1.0.0" newVersion = "3.5.0.0"/>
         </dependentAssembly>

         <dependentAssembly>
            <assemblyIdentity name = "System.Web.Extensions.Design" publicKeyToken = "31bf3856ad364e35"/>
            <bindingRedirect oldVersion = "1.0.0.0-1.1.0.0" newVersion = "3.5.0.0"/>
         </dependentAssembly>

      </assemblyBinding>
   </runtime>

   <system.serviceModel>
      <services>
         <service behaviorConfiguration = "ServiceBehavior" name = "Service">
            <endpoint address = "" binding = "basicHttpBinding" contract = "IMathService">

            <identity>
               <dns value = "localhost"/>
            </identity>

            </endpoint>
            <endpoint address = "mex" binding = "mexHttpBinding" contract = "IMetadataExchange"/>
         </service>
      </services>

      <behaviors>
         <serviceBehaviors>
            <behavior name = "ServiceBehavior">
               <!--
                  To avoid disclosing metadata information, set the value below
                  to false before deployment.
               -->
               <serviceMetadata httpGetEnabled="true"/>

               <!--
                  To receive exception details in faults for debugging purposes,
                  set the value below to true. Set to false before deployment to avoid
                  disclosing exception information
               -->
               <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
         </serviceBehaviors>
      </behaviors>

   </system.serviceModel>
</configuration>

ホストされたサービスへの異なるバインディングを有効にする

  • [スタート]メニュー→[プログラム]→[アクセサリ]に移動します。 [コマンドプロンプト]を右クリックし、コンテキストメニューから[管理者として実行]を選択します。
  • 次のコマンドを実行します-
C:\Windows\system32\inetsrv>appcmd set app "Default Web Site/WASHostedService"/enabledProtocols:http,net.tcp

それは次の出力を生成します-

Wcf Hosting Services WAS 6