Esempio n. 1
0
 protected RpcServer(IRpcServerStub implementation)
 {
     _exceptionDetails = RpcErrorDetailBehavior.FullDetails;
     _extensions = ExtensionRegistry.CreateInstance();
     _serverPrincipalName = null;
     _implementation = implementation;
 }
 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());
        }