hprose / hprose-dotnet

Hprose 3.0 for .NET
MIT License
383 stars 98 forks source link

自定义类做参数和返回类型是否必须要手动TypeManager.Register ? #64

Closed tky753 closed 4 years ago

tky753 commented 4 years ago

第一次用Hprose-dotnet,之前也只用过hporse-go,定义了一个如下的通用 输入 和 输出

public class RpcInput
{
    public string Str { get; set; }
}
public class RpcOutput
{
    public string Err { get; set; }
}

然后服务端

public static Service HproseSvc;
private static HttpListener _hproseServer;
class MyService
{
    public RpcOutput Test(RpcInput input)
    {
        return new RpcOutput
        {
            Err = input.Str
        };
    }
}
public static void InitHprose()
{
    TypeManager.Register<RpcInput>();  //不写会报错!?
    HproseSvc = new Service();
    HproseSvc.AddInstanceMethods(new MyService());
}

public static void StartServer()
{
    if(_hproseServer == null)
    {
        _hproseServer = new HttpListener();
        _hproseServer.Prefixes.Add("http://127.0.0.1:10249/");
    }
    if(HproseSvc == null)
    {
        InitHprose();
        HproseSvc.Bind(_hproseServer);
    }
    if(!_hproseServer.IsListening)
        _hproseServer.Start();
}

客户端

public interface IMyService
{
    RpcOutput Test(RpcInput input);
}
public static async Task TestClient()
{
    TypeManager.Register<RpcOutput>();  //不写会报错!?
    var client = new Client("http://127.0.0.1:10249");
    var proxy = client.UseService<IMyService>();
    var output = proxy.Test(new RpcInput
    {
        Str = "中文",
    });
    Console.WriteLine(JsonConvert.SerializeObject(output, Formatting.Indented));
}

不知道是不是我少了一道工序,还是怎么的, 服务端的 Register<RpcInput>() 和 客户端的 在Register<RpcOutput>() 是否必须要写?否则会报错。

andot commented 4 years ago

是都要写。

tky753 commented 4 years ago

好的,谢谢