C#で学ぶWeb技術を活用したサーバーの作成ガイド

目次

はじめに

ドキュメントの目的

本ドキュメントは、C#を使ったWebサーバー作成に関する複数の記事をまとめ、読みやすく実装手順と要点を提示します。具体例を交え、初心者でも実践できるように整理しました。

想定読者と前提知識

対象はプログラミング経験があり、C#の基本(変数、クラス、簡単な入出力)を理解している方です。ネットワークの深い知識は不要で、基礎があれば学べます。

本書で学べること

  • WebSocketサーバーの基本構造と実装の流れ
  • MCP(標準入出力型・Webサーバー型)の作り方
  • Visual C#でのリモートサーバー構築手順
    各章でサンプルコードと設定手順を示します。

進め方

実例を手元で動かしながら学ぶと理解が早まります。コードは小さな単位で試し、動作を確かめてください。

注意点

実行環境や依存ライブラリのバージョンにより挙動が変わることがあります。各章で明記しますので、指示に従ってください。

C#でWebSocketサーバーを書く(MDN)

概要

WebSocketはブラウザとサーバー間で双方向通信を行う仕組みです。ここではC#でTCP接続を使い、TcpListenerでサーバーを立ててWebSocketのハンドシェイクとメッセージ処理を説明します。

サーバーの起動

TcpListenerを使いIPアドレスとポートを指定してListenします。接続が来たらNetworkStreamでクライアントの最初のHTTP GETを受け取ります。例: Listen→AcceptTcpClient→GetStream。

ハンドシェイク(RFC 6455準拠)

クライアントのGETヘッダーからSec-WebSocket-Keyを取得し、固定のGUID(258EAFA5-E914-47DA-95CA-C5AB0DC85B11)を連結してSHA-1でハッシュ化し、Base64エンコードした値をSec-WebSocket-Acceptに入れてHTTP/1.1 101 Switching Protocolsを返します。これでWebSocket接続が確立します。

フレーム処理とマスク解除

クライアントからのペイロードはマスクされます。4バイトのmasking-keyを取得し、ペイロードの各バイトに対してmask[i % 4]とXORして元のデータを復元します。サーバー側は送信時にマスク不要です。

ブラウザ互換性

一般的なブラウザではChrome16以上、Firefox11以上、IE10以上で対応します。実装時はハンドシェイクとフレームの仕様を厳密に守ることが安定動作の鍵です。

C#でMCP Serverを作る(Zenn)

概要

Model Context Protocol(MCP)をC#で実装する手順を説明します。標準入出力型(CLIプロセスと通信)とWebサーバー型(HTTPトランスポート)の2パターンを紹介します。共通機能はクラスライブラリ化し、再利用します。

プロジェクト構成(例)

  • Mcp.Common(クラスライブラリ):メッセージ処理、インターフェイス、モデル
  • Mcp.Stdio(コンソールアプリ):標準入出力トランスポート
  • Mcp.Web(ASP.NET Core):HTTPトランスポート

dotnetコマンドの例
– dotnet new classlib -n Mcp.Common
– dotnet new console -n Mcp.Stdio
– dotnet new web -n Mcp.Web
– 各プロジェクトから Mcp.Common を参照:dotnet add reference ../Mcp.Common/Mcp.Common.csproj

共通ライブラリ

共通部分にはIMcpHandlerやMcpMessageクラスを置きます。処理は非同期メソッドにして、テストやDI(依存性注入)で差し替えやすくします。

標準入出力型(Generic Host)

Generic Hostを使い、DIとロギングを設定します。Program.csではHost.CreateDefaultBuilder(args)
.ConfigureServices((ctx, services)=> services.AddSingleton())
.ConfigureLogging(l=>{})
.Build().RunAsync();

トランスポートはConsole.In/Outを行単位で読み書きし、受信JSONをIMcpHandlerで処理してJSONで返します。プロセス連携が簡単にできます。

Webサーバー型(ASP.NET Core)

ASP.NET Coreでエンドポイントを用意します。最小例:app.MapPost(“/mcp”, async (HttpRequest req, IMcpHandler h) => { var json = await new StreamReader(req.Body).ReadToEndAsync(); var resp = await h.HandleAsync(json); return Results.Text(resp, “application/json”); });

DIとILoggerは標準のサービスコンテナで利用できます。HTTPはプロキシや認証導入が容易です。

VSCode設定例

launch.jsonで”program”:”${workspaceFolder}/Mcp.Stdio/bin/Debug/net6.0/Mcp.Stdio.dll”を指定するか、デバッグ構成に”.NET Core Launch (console)”を使います。tasks.jsonでビルドコマンドを登録すると便利です。

Visual C#を使用してリモートサーバーを作成する(Microsoft Learn)

概要

Visual C#でリモートサーバーを作る基本手順を、できるだけ分かりやすく説明します。サーバー側は公開するメソッドを持つクラスを用意し、通信チャネルを登録して外部から呼び出せるようにします。

手順(簡潔)

  1. クラスライブラリを作成
  2. publicなクラスを作り、MarshalByRefObjectを継承します。
  3. 例: public class RemoteServer : MarshalByRefObject { public string SayHello(string name) { return “Hello, ” + name; } }

  4. DLLをビルド

  5. プロジェクトをビルドしてDLLを生成します。サーバー実行プロジェクトから参照します。

  6. サーバー側でTcpChannelを登録

  7. TcpChannelを使ってポートを指定し、チャネルを登録します。
  8. 例: ChannelServices.RegisterChannel(new TcpChannel(9000), false);
  9. 次に公開設定を行います。例: RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteServer), “RemoteServer”, WellKnownObjectMode.Singleton);

  10. クライアントからアクセス

  11. クライアントもTcpChannelを登録し、Activator.GetObjectでプロキシを取得します。
  12. 例: var srv = (RemoteServer)Activator.GetObject(typeof(RemoteServer), “tcp://localhost:9000/RemoteServer”); srv.SayHello(“太郎”);

注意点

  • ポート番号やファイアウォール設定に注意してください。ネットワーク環境によって接続できない場合があります。
  • セキュリティや認証は別途検討してください。簡単な例では認証を省略しますが、本番では必須です。

この流れで、Visual C#を使った基本的なリモートオブジェクト公開が行えます。必要に応じて、例外処理やログ、スレッド対策を追加してください。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

目次