はじめに
ドキュメントの目的
本ドキュメントは、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#でリモートサーバーを作る基本手順を、できるだけ分かりやすく説明します。サーバー側は公開するメソッドを持つクラスを用意し、通信チャネルを登録して外部から呼び出せるようにします。
手順(簡潔)
- クラスライブラリを作成
- publicなクラスを作り、MarshalByRefObjectを継承します。
-
例: public class RemoteServer : MarshalByRefObject { public string SayHello(string name) { return “Hello, ” + name; } }
-
DLLをビルド
-
プロジェクトをビルドしてDLLを生成します。サーバー実行プロジェクトから参照します。
-
サーバー側でTcpChannelを登録
- TcpChannelを使ってポートを指定し、チャネルを登録します。
- 例: ChannelServices.RegisterChannel(new TcpChannel(9000), false);
-
次に公開設定を行います。例: RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteServer), “RemoteServer”, WellKnownObjectMode.Singleton);
-
クライアントからアクセス
- クライアントもTcpChannelを登録し、Activator.GetObjectでプロキシを取得します。
- 例: var srv = (RemoteServer)Activator.GetObject(typeof(RemoteServer), “tcp://localhost:9000/RemoteServer”); srv.SayHello(“太郎”);
注意点
- ポート番号やファイアウォール設定に注意してください。ネットワーク環境によって接続できない場合があります。
- セキュリティや認証は別途検討してください。簡単な例では認証を省略しますが、本番では必須です。
この流れで、Visual C#を使った基本的なリモートオブジェクト公開が行えます。必要に応じて、例外処理やログ、スレッド対策を追加してください。












