尝试序列化参数http://tempuri.org/:exception时出错。在C#中

时间:2017-12-14 20:09:49

标签: c# visual-studio wcf datacontractserializer

我从门户网站应用程序调用我的WCF方法。

我的WCF设置如下:

 [ServiceContract]
    public interface ILogging
        {
            [OperationContract]
            [ServiceKnownType(typeof(ErrorExceptionInformation))]
            void LogException(ErrorExceptionInformation exception);
        }


    public class Logging : ILogging
        {
            public void LogException(ErrorExceptionInformation exception)
            {

                LogProviderManager.Default.WriteLog(exception.Application, exception.Exception, true, exception.Category);
            }
        }

        [DataContract]
        public class ErrorExceptionInformation
        {
            [DataMember]
            public string Application { get; set; }

            [DataMember]
            public Exception Exception { get; set; }

            [DataMember]
            public string Category { get; set; }

        }

这就是我在门户网站应用程序中调用的方式:

ErrorExceptionInformation information = new ErrorExceptionInformation
                {
                    Exception = errorToLog,
                    Application = Models.Constants.ErrorLog.ErrorLocation,
                    Category = Models.Constants.ErrorLog.AdminPortalEnvironmentName
                };

                new LoggingClient().LogException(information);

但是我一直收到以下错误: 如果您正在使用DataContractSerializer或者将任何静态未知的类型添加到已知类型列表中,请考虑使用DataContractResolver - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给序列化程序的已知类型列表中。' 。有关详细信息,请参阅InnerException。

1 个答案:

答案 0 :(得分:0)

错误告诉您可以执行此操作:


Class<?> c = Class.forName("class name");
Method method = c.getDeclaredMethod("method name", parameterTypes);
method.invoke(objectToInvokeOn, params);
  

更新

或者将属性放在界面而不是操作合同上:

[ServiceContract]
public interface ILogging
{
    [OperationContract]
    [ServiceKnownType("GetKnownTypes", typeof(KnownTypeHelper))] // << -- change this
    void LogException(ErrorExceptionInformation exception);
}

static class KnownTypeHelper
{
    public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
    {
        System.Collections.Generic.List<System.Type> knownTypes =
            new System.Collections.Generic.List<System.Type>();

        knownTypes.Add(typeof(ErrorExceptionInformation));
       // knownTypes.Add(typeof(... any others....));

        return knownTypes;
    }
}