我从门户网站应用程序调用我的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。
答案 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;
}
}