protected RpcServer(IRpcServerStub implementation) { _exceptionDetails = RpcErrorDetailBehavior.FullDetails; _extensions = ExtensionRegistry.CreateInstance(); _serverPrincipalName = null; _implementation = implementation; }
/// <summary> /// Constructs the exception details for the server to return /// </summary> public static RpcExceptionInfo Create(Exception error, RpcErrorDetailBehavior details) { if (details == RpcErrorDetailBehavior.NoDetails) { return DefaultInstance; } Builder builder = CreateBuilder(); SerializationInfo si = new SerializationInfo(error.GetType(), FormatterConverter); if (details == RpcErrorDetailBehavior.MessageOnly) { si.AddValue("Message", error.Message); } else if (details == RpcErrorDetailBehavior.FullDetails) { try { error.GetObjectData(si, StreamingContext); builder.SetHasFullDetails(true); } catch { } } builder.AssemblyName = si.AssemblyName; builder.FullTypeName = si.FullTypeName; foreach (SerializationEntry se in si) { switch (se.Name) { case "ClassName": if (se.Value is string) { builder.SetClassName((string) se.Value); } break; case "Message": if (se.Value is string) { builder.SetMessage((string) se.Value); } break; //case "Data": if (se.Value is string) builder.SetData((string)se.Value); break; case "InnerException": if (se.Value is Exception) { builder.SetInnerException(Create((Exception) se.Value, details)); } break; case "HelpURL": if (se.Value is string) { builder.SetHelpUrl((string) se.Value); } break; case "StackTraceString": if (se.Value is string) { builder.SetStackTraceString((string) se.Value); } break; case "RemoteStackTraceString": if (se.Value is string) { builder.SetRemoteStackTraceString((string) se.Value); } break; case "RemoteStackIndex": if (se.Value is int) { builder.SetRemoteStackIndex((int) se.Value); } break; case "ExceptionMethod": if (se.Value is string) { builder.SetExceptionMethod((string) se.Value); } break; case "HResult": if (se.Value is int) { builder.SetHResult((int) se.Value); } break; case "Source": if (se.Value is string) { builder.SetSource((string) se.Value); } break; default: { if (se.ObjectType == typeof (String) || //se.ObjectType == typeof(byte[]) || (se.ObjectType.IsPrimitive && se.ObjectType.Assembly == typeof (String).Assembly)) { Types.RpcExceptionData.Builder data = Types.RpcExceptionData.CreateBuilder() .SetMember(se.Name) .SetType(se.ObjectType.FullName) ; if (se.Value != null) { data.SetValue(se.Value is byte[] ? Convert.ToBase64String((byte[]) se.Value) : Convert.ToString(se.Value)); } builder.AddExceptionData(data.Build()); } else { builder.AddExceptionData( Types.RpcExceptionData.CreateBuilder().SetMember(se.Name).SetType( typeof (Object).FullName)); } break; } } } return builder.Build(); }
/// <summary> /// Constructs the exception details for the server to return /// </summary> public static RpcExceptionInfo Create(Exception error, RpcErrorDetailBehavior details) { if (details == RpcErrorDetailBehavior.NoDetails) { return(DefaultInstance); } Builder builder = CreateBuilder(); SerializationInfo si = new SerializationInfo(error.GetType(), FormatterConverter); if (details == RpcErrorDetailBehavior.MessageOnly) { si.AddValue("Message", error.Message); } else if (details == RpcErrorDetailBehavior.FullDetails) { try { error.GetObjectData(si, StreamingContext); builder.SetHasFullDetails(true); } catch { } } builder.AssemblyName = si.AssemblyName; builder.FullTypeName = si.FullTypeName; foreach (SerializationEntry se in si) { switch (se.Name) { case "ClassName": if (se.Value is string) { builder.SetClassName((string)se.Value); } break; case "Message": if (se.Value is string) { builder.SetMessage((string)se.Value); } break; //case "Data": if (se.Value is string) builder.SetData((string)se.Value); break; case "InnerException": if (se.Value is Exception) { builder.SetInnerException(Create((Exception)se.Value, details)); } break; case "HelpURL": if (se.Value is string) { builder.SetHelpUrl((string)se.Value); } break; case "StackTraceString": if (se.Value is string) { builder.SetStackTraceString((string)se.Value); } break; case "RemoteStackTraceString": if (se.Value is string) { builder.SetRemoteStackTraceString((string)se.Value); } break; case "RemoteStackIndex": if (se.Value is int) { builder.SetRemoteStackIndex((int)se.Value); } break; case "ExceptionMethod": if (se.Value is string) { builder.SetExceptionMethod((string)se.Value); } break; case "HResult": if (se.Value is int) { builder.SetHResult((int)se.Value); } break; case "Source": if (se.Value is string) { builder.SetSource((string)se.Value); } break; default: { if (se.ObjectType == typeof(String) || //se.ObjectType == typeof(byte[]) || (se.ObjectType.IsPrimitive && se.ObjectType.Assembly == typeof(String).Assembly)) { Types.RpcExceptionData.Builder data = Types.RpcExceptionData.CreateBuilder() .SetMember(se.Name) .SetType(se.ObjectType.FullName) ; if (se.Value != null) { data.SetValue(se.Value is byte[] ? Convert.ToBase64String((byte[])se.Value) : Convert.ToString(se.Value)); } builder.AddExceptionData(data.Build()); } else { builder.AddExceptionData( Types.RpcExceptionData.CreateBuilder().SetMember(se.Name).SetType( typeof(Object).FullName)); } break; } } } return(builder.Build()); }