【问题标题】:There was an error while trying to serialize parameter http://tempuri.org/:callback尝试序列化参数 http://tempuri.org/:callback 时出错
【发布时间】:2011-05-14 01:22:27
【问题描述】:

我有一个异步 WCF 服务器(我已经派生了我自己的客户端基类),我从我的客户端应用程序中调用它。

但是,当这个方法被调用时:

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

我得到了这个例外:

{“尝试序列化参数 http://tempuri.org/:callback 时出错。InnerException 消息是 'Type 'System.DelegateSerializationHolder+DelegateEntry' 数据协定名称为 'DelegateSerializationHolder.DelegateEntry:http://schemas.datacontract.org/ 2004/07/System' 不是预期的。将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。'。请参阅 InnerException了解更多详情。”}

如果我有自己的类,并且有自己的属性,那么这个异常是有意义的,但这是一个标准的 .NET 类型(AsyncCallback 我相信这个异常是在抱怨)。我正在尝试做的代码示例没有这个问题(我将其更改为我正在使用的相同类型的绑定 - 命名管道)。

怎么了?

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    您可能忘记在 [OperationContract] 属性中添加 (AsyncPattern = true) 属性。下面的示例显示了两个客户端,一个(错误)具有您所看到的确切错误,一个(正确)有效。唯一的区别是操作合约中的 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();
        }
    }
    

    【讨论】:

    • 在看到你的帖子之前我就意识到了,还是谢谢!
    猜你喜欢
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多