定义、发布、启动服务
定义服务
在服务器端中新建一个类,继承于RpcServer类(或实现IRpcServer),然后在该类中写公共方法,并用WebApi属性标签标记,如果方法有重载,需要重新指定函数键。
- 支持代理生成注释。
public class ApiServer : RpcServer
{
[Router("[api]/[action]ab")]//此路由会以"/Server/Sumab"实现
[WebApi(HttpMethodType.GET)]
public int Sum(int a, int b)
{
return a + b;
}
[WebApi(HttpMethodType.POST)]
public int TestPost(MyClass myClass)
{
return myClass.A + myClass.B;
}
/// <summary>
/// 使用调用上下文,响应文件下载。
/// </summary>
/// <param name="callContext"></param>
[WebApi(HttpMethodType.GET, MethodFlags = MethodFlags.IncludeCallContext)]
public Task<string> DownloadFile(IWebApiCallContext callContext, string id)
{
if (id == "rrqm")
{
callContext.HttpContext.Response.FromFile(@"D:\System\Windows.iso", callContext.HttpContext.Request);
return Task.FromResult("ok");
}
return Task.FromResult("id不正确。");
}
/// <summary>
/// 使用调用上下文,获取实际请求体。
/// </summary>
/// <param name="callContext"></param>
[WebApi(HttpMethodType.POST, MethodFlags = MethodFlags.IncludeCallContext)]//声明包含调用上下文
[Router("[api]/[action]")]
public Task<string> PostContent(IWebApiCallContext callContext)
{
if (callContext.Caller is ISocketClient socketClient)
{
this.m_logger.Info($"IP:{socketClient.IP},Port:{socketClient.Port}");//获取Ip和端口
}
if (callContext.HttpContext.Request.TryGetContent(out byte[] content))
{
this.m_logger.Info($"共计:{content.Length}");
}
return Task.FromResult("ok");
}
}
public class MyClass
{
public int A { get; set; }
public int B { get; set; }
}
创建简单服务器
HttpService service = new HttpService();
service.Setup(new TouchSocketConfig()
.UsePlugin()
.SetListenIPHosts(new IPHost[] { new IPHost(7789) })
.ConfigureContainer(a =>
{
a.SetSingletonLogger<ConsoleLogger>();//注册一个日志
})
.ConfigureRpcStore(a =>
{
a.RegisterServer<ApiServer>();//注册服务
})
.ConfigurePlugins(a =>
{
a.UseCheckClear();
a.UseWebApi();//启用WebApi
}))
.Start();
Console.WriteLine("以下连接用于测试webApi");
Console.WriteLine($"使用:http://127.0.0.1:7789/ApiServer/Sum?a=10&b=20");
Console.ReadKey();