2011-05-14 42 views
2

私は非同期のWCFサーバーを持っています(自分のクライアントベースクラスを派生しました)。パラメータhttp://tempuri.org/:callbackをシリアル化しようとしたときにエラーが発生しました

public IAsyncResult Beginxxx(string path, AsyncCallback callback, object state) 
{ 
    return Channel.Beginxxx(path, callback, state); 
} 

私はこの例外を取得:このメソッドが呼び出されたが

{ "パラメータhttp://tempuri.org/:callbackをシリアル化しようとしているときにエラーが発生しましたのInnerExceptionメッセージは、 'タイプ' でした。 System.DelegateSerializationHolder + DelegateEntry 'をデータコントラクト名' DelegateSerializationHolder.DelegateEntry:http://schemas.datacontract.org/2004/07/System 'と一緒に使用しないでください。既知のタイプのリストに静的に知られていないタイプを追加します、KnownTypeAttribute属性を使用してまたはDataContractSerializerに渡される既知の型のリストにそれらを追加することによって、 '。 "}

この例外は意味をなさないでしょうが、これは標準的な.NET型です(AsyncCallbackは例外であると私は信じています)。私がやろうとしています何のコードサンプルは、この問題を持っていない(と私は私が使用している結合の同じタイプにすることをを変更する - 名前付きパイプを)。?間違っている

答えて

6

あなたはおそらく忘れてしまいました(OperationContract)属性に(AsyncPattern = true)プロパティを追加する以下の例は、2つのクライアントを表示しています。 orks。唯一の違いは、操作契約のAsyncPattern = trueです。

public class StackOverflow_5999249_751090 
{ 
    [ServiceContract(Name = "ITest", Namespace = "")] 
    public interface ITest 
    { 
     [OperationContract] 
     string Echo(string path); 
    } 

    public class Service : ITest 
    { 
     public string Echo(string path) { return path; } 
    } 

    [ServiceContract(Name = "ITest", Namespace = "")] 
    public interface ITestClient_Wrong 
    { 
     [OperationContract] 
     IAsyncResult BeginEcho(string path, AsyncCallback callback, object state); 
     string EndEcho(IAsyncResult asyncResult); 
    } 

    [ServiceContract(Name = "ITest", Namespace = "")] 
    public interface ITestClient_Correct 
    { 
     [OperationContract(AsyncPattern = true)] 
     IAsyncResult BeginEcho(string path, AsyncCallback callback, object state); 
     string EndEcho(IAsyncResult asyncResult); 
    } 

    static void PrintException(Exception e) 
    { 
     int indent = 2; 
     while (e != null) 
     { 
      for (int i = 0; i < indent; i++) 
      { 
       Console.Write(' '); 
      } 

      Console.WriteLine("{0}: {1}", e.GetType().FullName, e.Message); 
      indent += 2; 
      e = e.InnerException; 
     } 
    } 

    public static void Test() 
    { 
     string baseAddress = "net.pipe://localhost/Service"; 
     ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); 
     host.AddServiceEndpoint(typeof(ITest), new NetNamedPipeBinding(), ""); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     AutoResetEvent evt = new AutoResetEvent(false); 

     Console.WriteLine("Correct"); 
     ChannelFactory<ITestClient_Correct> factory1 = new ChannelFactory<ITestClient_Correct>(new NetNamedPipeBinding(), new EndpointAddress(baseAddress)); 
     ITestClient_Correct proxy1 = factory1.CreateChannel(); 
     proxy1.BeginEcho("Hello", delegate(IAsyncResult ar) 
     { 
      Console.WriteLine("Result from correct: {0}", proxy1.EndEcho(ar)); 
      evt.Set(); 
     }, null); 
     evt.WaitOne(); 

     Console.WriteLine("Wrong"); 
     ChannelFactory<ITestClient_Wrong> factory2 = new ChannelFactory<ITestClient_Wrong>(new NetNamedPipeBinding(), new EndpointAddress(baseAddress)); 
     ITestClient_Wrong proxy2 = factory2.CreateChannel(); 
     try 
     { 
      proxy2.BeginEcho("Hello", delegate(IAsyncResult ar) 
      { 
       try 
       { 
        Console.WriteLine("Result from wrong: {0}", proxy2.EndEcho(ar)); 
       } 
       catch (Exception e) 
       { 
        PrintException(e); 
       } 
       evt.Set(); 
      }, null); 
      evt.WaitOne(); 
     } 
     catch (Exception e2) 
     { 
      PrintException(e2); 
     } 

     Console.WriteLine("Press ENTER to close"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 
+0

あなたの投稿を見る前に気付いた、とにかく感謝! – dotnetdev

関連する問題