2017-12-14 122 views
0

私はポータルアプリケーションから自分のWCFメソッドを呼び出しています。パラメータhttp://tempuri.org/:例外をシリアル化しようとしているときにエラーが発生しました。 C#で

[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; } 

     } 

、これは私がポータルアプリケーションで呼び出す方法です::次のように

私のWCFの設定がある

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

       new LoggingClient().LogException(information); 

は、しかし、私は、次のエラーを取得しておいてください。 場合DataContractResolverの使用を検討してくださいDataContractSerializerを使用しているか、またはKnownTypeAttribute属性を使用するか、シリアライザに渡される既知の型のリストに追加するなど、既知の型のリストに静的に知られていない型を追加してください。 '詳細については、InnerExceptionを参照してください。

[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; 
    } 
} 

Update

をOR代わりに操作契約のインターフェイスに属性を置く:

答えて

0

エラーがあなたを語っているあなたはこれを行うことができます

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

私はレリ得ていないのです(ServiceKnownType(typeof(ErrorExceptionInformation))を使用するのと同じように) –

+0

私はこれをやっている理由はあなたの方法が私に同じエラーを与えるからです。 – Crowcoder

+0

@babujiこれは、これをさらに調べるように促しました。そのバージョンを使用すると、属性は操作契約ではなくインターフェースに表示されます。 – Crowcoder

関連する問題