增加使用说明
# ApiServer ʹÓÃ˵Ã÷
±¾ÎĽéÉÜ `ApiServer` µÄ¹¦ÄÜÓëÓ÷¨£¬º¸Ç·þÎñÆô¶¯¡¢¿ØÖÆÆ÷×¢²á¡¢ÇëÇó´¦Àí¡¢ÈÏÖ¤¡¢¿É¹Û²âÐÔ¡¢¹ã²¥ÓëÓë Razor Pages µÄ¼¯³É½¨Ò飨×÷Ϊºǫ́·þÎñ»ò±ß³µ£©¡£
## 1. ¸ÅÊö
- ×÷ÓãºÓ¦Óòã RPC ·þÎñÆ÷£¬»ùÓÚ `IApiServer`£¨`ApiNetServer` »ò `ApiHttpServer`£©³ÐÔØÍøÂç»á»°¡£
- ´«Ê䣺Tcp / Udp / Http / WebSocket£¨È¡¾öÓÚ `Use(NetUri)` µÄµØÖ·ÀàÐÍ£©¡£
- ÆõÔ¼£º»ùÓÚ `IMessage`/`ApiMessage` Óë `IEncoder`£»Ä¬ÈÏ JSON£¬¿ÉÇл» Http ÓïÒå¡£
## 2. ¿ìËÙ¿ªÊ¼£¨Tcp£©
```csharp
var server = new ApiServer(12345)
{
Log = XTrace.Log
};
server.Register(new DemoController());
server.Start();
Console.ReadLine();
server.Stop("quit");
```
- Ò²¿ÉʹÓà `Use(new NetUri("tcp://*:12345"))` Ö¸¶¨¼àÌýµØÖ·¡£
- Http ¼àÌý£º`Use(new NetUri("http://*:8080"))` ½«Ê¹Óà `ApiHttpServer`¡£
## 3. ¿ØÖÆÆ÷Ó붯×÷×¢²á
- ×Ô¶¯×¢²á£º¹¹Ô캯ÊýÒÑ×¢²áÄÚÖà `ApiController`£¬Ìṩ `api/all`¡¢`api/info` µÈͨÓýӿڡ£
- ÊÖ¶¯×¢²á£º
```csharp
server.Register(new MyController()); // ×¢²á¿ØÖÆÆ÷È«²¿¹«¿ª·½·¨
server.Register(new MyController(), "Echo"); // ½ö×¢²áÃüÃû·½·¨
server.Register<MyController>(); // ×¢²áÀàÐÍ£¨ÄÚ²¿»á´´½¨ÊµÀý£©
```
- ÒÀÀµ×¢È룺ÉèÖà `ServiceProvider` ºó£¬´´½¨¿ØÖÆÆ÷ʵÀýʱ¿É´ÓÈÝÆ÷½âÎö¡£
## 4. ÇëÇó´¦ÀíÁ÷³Ì
- `Process(session, msg, serviceProvider)`£º
- ½âÂë `IMessage` Ϊ `ApiMessage`£¬°´ `action` ·Óɵ½ `IApiHandler` Ö´ÐС£
- ²¶»ñÒì³£²¢Ó³ÉäΪ `ApiCode` Óë´íÎóÏûÏ¢£¨Êý¾Ý¿âÒì³£ÍÑÃô£©¡£
- `OneWay` ÇëÇó²»·µ»ØÏìÓ¦¡£
- Èô `UseHttpStatus=true`£¬¶Ô Http ³¡¾°Ê¹Óà HTTP ״̬Âë±í´ï½á¹û¡£
- finally ÖмǼÂý´¦ÀíÈÕÖ¾£¨³¬¹ý `SlowTrace`£©¡£
## 5. ÈÏÖ¤Óë»á»°
- token ģʽ£º
- ¿Í»§¶Ë¿ÉÔÚ²ÎÊýЯ´ø `Token`¡£
- ·þÎñ¶Ë¿ÉÔÚ `IApiHandler.Prepare` »ò¿ØÖÆÆ÷ÖÐУÑé Token£¬²¢½«Óë¸Ã Token ¹ØÁªµÄ״̬·ÅÈë `IApiSession.Items`¡£
- `OnProcess`£ºÄ¬ÈÏίÍиø `Handler.Execute`£¬¿ÉÖØÐ´ÒÔʵÏÖͳһµÄ¼øÈ¨ÓëÀ¹½Ø¡£
## 6. ¿É¹Û²âÐÔÓëͳ¼Æ
- ÈÕÖ¾£º`ILog Log`£¨·þÎñÆ÷ÈÕÖ¾£©¡¢`SessionLog`£¨»á»°ÈÕÖ¾£©¡£
- ×·×Ù£º`ITracer? Tracer`¡£
- Âý´¦Àí£º`SlowTrace`£¨ºÁÃ룩¡£³¬¹ýãÐÖµÊä³ö°üº¬ Action¡¢Code¡¢ºÄʱµÄÂý´¦ÀíÈÕÖ¾¡£
- ͳ¼Æ£º`ICounter? StatProcess` + `StatPeriod`£¨Ã룩¶¨ÆÚÊä³ö´¦Àíͳ¼ÆÓëµ×²ãÍøÂç״̬¡£
## 7. WebSocket Óë Http
- WebSocket£º×Ô¶¯Çл»µ½ `WebSocketClientCodec` ½øÐÐÏûÏ¢Ö¡±à½âÂë¡£
- Http£º`ApiHttpServer` ÅäºÏ `HttpEncoder` Ö§³Ö GET/POST Ó³Éäµ½ `ApiMessage`£»¿Éͨ¹ý `UseHttpStatus` Çл»Îª HTTP ״̬Âë±í´ï½á¹û¡£
## 8. ¶Ë¿ÚÓëµØÖ·¸´ÓÃ
- `ReuseAddress`£ºÔÊÐí¶à½ø³Ì¸´Óö˿ڣ¬ÓÃÓÚ¹ö¶¯ÖØÆô»ò¶à½ø³Ì¼àÌý£¨Ðèϵͳ֧³Ö£©¡£
- `Multiplex`£ºÍ¬Ò» TCP Á¬½ÓÔÊÐíÔÚδÍê³ÉµÄÇëÇóÆÚ¼ä²¢Ðд¦ÀíÐÂÇëÇó£¨ÌáÉýÍÌÍ£©¡£
## 9. ¹ã²¥
- `InvokeAll(action, args)`£ºÏòËùÓлỰµ¥Ïò·¢ËÍ֪ͨ£»·µ»Ø³É¹¦»á»°Êý¡£
## 10. ×ÊÔ´ÊÍ·Å
- `Stop(reason)`£ºÍ£Ö¹ÍøÂç·þÎñÆ÷Óëͳ¼Æ¶¨Ê±Æ÷¡£
- `Dispose()`£ºÊÍ·Å×ÊÔ´²¢½â³ýÓëĬÈÏ `ApiController` µÄÏ໥ÒýÓá£
## 11. ÔÚ ASP.NET Core Razor Pages Öеɣ¨×÷Ϊºǫ́·þÎñ£©
- ×÷ΪËÞÖ÷Äڵĺǫ́·þÎñ£¨²»Ö±½Ó±©Â¶ÔÚ¹«Íø£©Ê¾Àý£º
```csharp
builder.Services.AddSingleton(sp =>
{
var svr = new ApiServer(12345)
{
Log = XTrace.Log,
UseHttpStatus = false
};
// ×¢²áÒµÎñ¿ØÖÆÆ÷
svr.Register(new MyController());
// Æô¶¯
svr.Start();
return svr;
});
```
- ×¢Ò⣺
- ʹÓà `UseHttpStatus=false` ±£³ÖÓëĬÈÏ JSON ÓïÒ弿ÈÝ£»ÈôÃæÏò´¿ Http ¿Í»§¶Ë¿ÉÉèΪ true¡£
- ½«·þÎñ¼àÌýÔÚÄÚÍøµØÖ·£¬¹©Í¬»úµÄ Razor Pages µ÷Ó㬻òͨ¹ý·´Ïò´úÀí±©Â¶±ØÒª½Ó¿Ú¡£
## 12. ³£¼ûÎÊÌâ
- Q£ºÈçºÎ²é¿´µ±Ç°ÓÐÄÄЩÒÑ×¢²á¶¯×÷£¿A£º`ShowService()` »áÔÚÆô¶¯Ê±Êä³ö·þÎñÁÐ±í¡£
- Q£ºÈçºÎ×Ô¶¨Òå·ÓÉ»òÀ¹½Ø£¿A£ºÌṩ×Ô¶¨Òå `IApiHandler` ²¢¸³¸ø `Handler`£¬»òÖØÐ´ `OnProcess`¡£
- Q£ºÊÇ·ñÖ§³Ö Udp£¿A£ºµ×²ã `ApiNetServer` Ö§³Ö NetType£»Ò»°ãÍÆ¼ö Tcp/Http/WebSocket¡£
|