次の方法で共有


リモート処理の例 : インターネット インフォメーション サービス (IIS) でのホスト

あまり複雑でない基本的な Web サービスを実装するサンプルを次に示します。このサンプルでは、ペイロードがよりコンパクトで、ストリームのシリアル化や逆シリアル化に要する時間が短くて済むことから、BinaryFormatter が使用されています。また、インターネット インフォメーション サービス (IIS) が統合 Windows 認証 (NTLM 認証ともいいます) を使用している場合は、サーバーがクライアントを認証し、IIS で認証できた ID をクライアントに返します。Web サービスを保護するには、クライアントの構成ファイルで URL を、プロトコル スキームとして "https" を使用するように変更し、その仮想ディレクトリについて SSL (Secure Sockets Layer) 認証を要求するように IIS を設定します。

注意

.NET Framework リモート処理では、既定では認証または暗号化を行いません。したがって、クライアントやサーバーとリモートで対話する前に、ID の確認に必要な手順をすべて実行することをお勧めします。.NET Framework リモート処理アプリケーションの実行には、FullTrust アクセス許可が必要です。そのため、承認されていないクライアントがサーバー上でのアクセスを許可された場合は、完全な信頼を与えられているものとして、コードを実行できてしまいます。リモート処理される型を IIS でホストするか、カスタム チャネル シンクのペアを構築することによって、常にエンドポイントを認証し、通信ストリームを暗号化してください。

このサンプルをコンパイルして実行するには

  1. RemoteIIS ディレクトリにあるすべてのファイルを保存します。

  2. コマンド プロンプトで次のように入力し、サンプル全体をコンパイルします。

    csc /noconfig /t:library /r:System.Web.dll /out:ServiceClass.dll ServiceClass.cs

    csc /noconfig /r:System.Runtime.Remoting.dll /r:System.dll /r:ServiceClass.dll Client.cs

  3. \bin サブディレクトリを作成し、そのディレクトリに ServiceClass.dll をコピーします。

  4. IIS に仮想ディレクトリを作成します。"HttpBinary" という仮想ディレクトリ エイリアスを作成し、ソース ディレクトリを "RemoteIIS" ディレクトリに設定します。

  5. この仮想ディレクトリの認証方法を、統合 Windows 認証 (以前の NTLM 認証) に設定します。

  6. IIS が起動されていることを確認し、"RemoteIIS" ディレクトリのコマンド プロンプトで「client」と入力します。

このアプリケーションは、1 台のコンピュータ上で、またはネットワーク経由で実行されます。このアプリケーションをネットワーク経由で実行するには、クライアント構成の "localhost" をリモート コンピュータの名前で置き換える必要があります。

ServiceClass.cs

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Threading;
using System.Web;

public interface IService{

   DateTime GetServerTime();
   string GetServerString();

}

// IService exists to demonstrate the possibility of publishing only the interface.
public class ServiceClass : MarshalByRefObject, IService{

   private int InstanceHash;

   public ServiceClass(){
      InstanceHash = this.GetHashCode();
   }

   public DateTime GetServerTime(){
      return DateTime.Now;
   }

   public string GetServerString(){
      // Use the HttpContext to acquire what IIS thinks the client's identity is.
      string temp = HttpContext.Current.User.Identity.Name;
      if (temp == null || temp.Equals(string.Empty))
         temp = "**unavailable**";
      return "Hi there. You are being served by instance number: " 
         + InstanceHash.ToString() 
         + ". Your alias is: " 
         + temp;
   }
}

Web.config

<configuration>
   <system.runtime.remoting>
      <application>
         <service>
            <wellknown 
               mode="SingleCall" objectUri="SAService.rem"
               type="ServiceClass, ServiceClass"/>
         </service>
         <channels>
            <channel ref="http"/>
         </channels>
      </application>
   </system.runtime.remoting>
</configuration>

Client.cs

using System;
using System.Collections;
using System.Diagnostics;
using System.Net;
using System.Reflection;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Security.Principal;

public class Client{

   public static void Main(string[] Args){

         // Tells the system about the remote object and customizes the HttpChannel
         // to use the binary formatter (which understands that base64 encoding is needed).
         RemotingConfiguration.Configure("Client.exe.config");

         // New proxy for the ServiceClass.
         // If you publish only the IService interface, you must use Activator.GetObject.
         ServiceClass service = new ServiceClass(); 
            
         // Programmatically customizes the properties given to the channel. This sample uses the
         // application configuration file.
         // IDictionary Props = ChannelServices.GetChannelSinkProperties(service);
         // Props["credentials"] = CredentialCache.DefaultCredentials;

         // Reports the client identity name.
         Console.WriteLine("ConsoleIdentity: " + WindowsIdentity.GetCurrent().Name);

         // Writes what the server returned.
         Console.WriteLine("The server says : " + service.GetServerString());
         Console.WriteLine("Server time is: " + service.GetServerTime());      
   }
}

Client.exe.config

<configuration>
   <system.runtime.remoting>
      <application>
         <channels>
            <channel ref="http" useDefaultCredentials="true" port="0">
               <clientProviders>
                  <formatter 
                     ref="binary"
                  />
               </clientProviders>
            </channel>
         </channels>
         <client>
            <wellknown 
               url="https://localhost:80/HttpBinary/SAService.rem"
               type="ServiceClass, ServiceClass"
            />
         </client>
      </application>
   </system.runtime.remoting>
</configuration>

参照

概念

リモート アプリケーションの構成
インターネット インフォメーション サービス (IIS) でのリモート オブジェクトのホスト

その他の技術情報

リモート処理の例